@isograph/react 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-compile-libs.log +2 -2
- package/dist/core/FragmentReference.d.ts +4 -2
- package/dist/core/FragmentReference.d.ts.map +1 -1
- package/dist/core/FragmentReference.js +2 -2
- package/dist/core/IsographEnvironment.d.ts +19 -11
- package/dist/core/IsographEnvironment.d.ts.map +1 -1
- package/dist/core/IsographEnvironment.js +27 -2
- package/dist/core/PromiseWrapper.d.ts +13 -7
- package/dist/core/PromiseWrapper.d.ts.map +1 -1
- package/dist/core/brand.d.ts +17 -0
- package/dist/core/brand.d.ts.map +1 -1
- package/dist/core/cache.d.ts +10 -7
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js +102 -74
- package/dist/core/check.d.ts +8 -4
- package/dist/core/check.d.ts.map +1 -1
- package/dist/core/check.js +10 -7
- package/dist/core/componentCache.d.ts +1 -1
- package/dist/core/componentCache.d.ts.map +1 -1
- package/dist/core/componentCache.js +6 -4
- package/dist/core/entrypoint.d.ts +17 -7
- package/dist/core/entrypoint.d.ts.map +1 -1
- package/dist/core/garbageCollection.d.ts +8 -2
- package/dist/core/garbageCollection.d.ts.map +1 -1
- package/dist/core/garbageCollection.js +36 -14
- package/dist/core/logging.d.ts +16 -3
- package/dist/core/logging.d.ts.map +1 -1
- package/dist/core/makeNetworkRequest.d.ts +4 -2
- package/dist/core/makeNetworkRequest.d.ts.map +1 -1
- package/dist/core/makeNetworkRequest.js +115 -38
- package/dist/core/optimisticProxy.d.ts +59 -0
- package/dist/core/optimisticProxy.d.ts.map +1 -0
- package/dist/core/optimisticProxy.js +399 -0
- package/dist/core/read.d.ts +3 -2
- package/dist/core/read.d.ts.map +1 -1
- package/dist/core/read.js +158 -123
- package/dist/core/reader.d.ts +7 -4
- package/dist/core/reader.d.ts.map +1 -1
- package/dist/core/startUpdate.d.ts +3 -2
- package/dist/core/startUpdate.d.ts.map +1 -1
- package/dist/core/startUpdate.js +33 -34
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/loadable-hooks/useClientSideDefer.d.ts +9 -4
- package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
- package/dist/loadable-hooks/useClientSideDefer.js +34 -1
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +5 -3
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
- package/dist/loadable-hooks/useConnectionSpecPagination.js +27 -13
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +1 -1
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.js +1 -1
- package/dist/react/FragmentReader.d.ts +2 -1
- package/dist/react/FragmentReader.d.ts.map +1 -1
- package/dist/react/FragmentRenderer.d.ts +2 -1
- package/dist/react/FragmentRenderer.d.ts.map +1 -1
- package/dist/react/LoadableFieldReader.d.ts +9 -3
- package/dist/react/LoadableFieldReader.d.ts.map +1 -1
- package/dist/react/LoadableFieldReader.js +40 -1
- package/dist/react/LoadableFieldRenderer.d.ts +9 -3
- package/dist/react/LoadableFieldRenderer.d.ts.map +1 -1
- package/dist/react/LoadableFieldRenderer.js +36 -1
- package/dist/react/useImperativeReference.d.ts +4 -3
- package/dist/react/useImperativeReference.d.ts.map +1 -1
- package/dist/react/useImperativeReference.js +3 -5
- package/dist/react/useLazyReference.d.ts +2 -1
- package/dist/react/useLazyReference.d.ts.map +1 -1
- package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
- package/dist/react/useReadAndSubscribe.js +1 -3
- package/dist/react/useResult.d.ts.map +1 -1
- package/dist/react/useResult.js +6 -5
- package/package.json +16 -17
- package/src/core/FragmentReference.ts +10 -4
- package/src/core/IsographEnvironment.ts +59 -13
- package/src/core/PromiseWrapper.ts +14 -7
- package/src/core/brand.ts +18 -0
- package/src/core/cache.ts +186 -91
- package/src/core/check.ts +21 -10
- package/src/core/componentCache.ts +8 -4
- package/src/core/entrypoint.ts +35 -6
- package/src/core/garbageCollection.ts +61 -19
- package/src/core/logging.ts +15 -3
- package/src/core/makeNetworkRequest.ts +307 -74
- package/src/core/optimisticProxy.ts +563 -0
- package/src/core/read.ts +233 -163
- package/src/core/reader.ts +10 -6
- package/src/core/startUpdate.ts +45 -30
- package/src/index.ts +2 -1
- package/src/loadable-hooks/useClientSideDefer.ts +76 -26
- package/src/loadable-hooks/useConnectionSpecPagination.ts +34 -17
- package/src/loadable-hooks/useImperativeLoadableField.ts +2 -2
- package/src/loadable-hooks/useSkipLimitPagination.ts +2 -3
- package/src/react/FragmentReader.tsx +3 -1
- package/src/react/FragmentRenderer.tsx +8 -1
- package/src/react/LoadableFieldReader.tsx +123 -12
- package/src/react/LoadableFieldRenderer.tsx +122 -12
- package/src/react/useImperativeReference.ts +20 -11
- package/src/react/useLazyReference.ts +17 -6
- package/src/react/useReadAndSubscribe.ts +1 -8
- package/src/react/useResult.ts +9 -11
- package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +1 -1
- package/src/tests/__isograph/Query/linkedUpdate/entrypoint.ts +3 -1
- package/src/tests/__isograph/Query/linkedUpdate/raw_response_type.ts +13 -0
- package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +1 -1
- package/src/tests/__isograph/Query/meName/entrypoint.ts +3 -1
- package/src/tests/__isograph/Query/meName/raw_response_type.ts +7 -0
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +1 -1
- package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +3 -1
- package/src/tests/__isograph/Query/meNameSuccessor/raw_response_type.ts +14 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +1 -1
- package/src/tests/__isograph/Query/nodeField/entrypoint.ts +3 -1
- package/src/tests/__isograph/Query/nodeField/raw_response_type.ts +7 -0
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +1 -1
- package/src/tests/__isograph/Query/normalizeUndefinedField/entrypoint.ts +33 -0
- package/src/tests/__isograph/Query/normalizeUndefinedField/normalization_ast.ts +25 -0
- package/src/tests/__isograph/Query/normalizeUndefinedField/output_type.ts +3 -0
- package/src/tests/__isograph/Query/normalizeUndefinedField/param_type.ts +9 -0
- package/src/tests/__isograph/Query/normalizeUndefinedField/query_text.ts +6 -0
- package/src/tests/__isograph/Query/normalizeUndefinedField/raw_response_type.ts +7 -0
- package/src/tests/__isograph/Query/normalizeUndefinedField/resolver_reader.ts +38 -0
- package/src/tests/__isograph/Query/startUpdate/entrypoint.ts +3 -1
- package/src/tests/__isograph/Query/startUpdate/raw_response_type.ts +8 -0
- package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +1 -1
- package/src/tests/__isograph/Query/subquery/entrypoint.ts +3 -1
- package/src/tests/__isograph/Query/subquery/raw_response_type.ts +9 -0
- package/src/tests/__isograph/Query/subquery/resolver_reader.ts +1 -1
- package/src/tests/__isograph/iso.ts +11 -1
- package/src/tests/garbageCollection.test.ts +8 -5
- package/src/tests/meNameSuccessor.ts +6 -3
- package/src/tests/nodeQuery.ts +4 -2
- package/src/tests/normalizeData.test.ts +89 -15
- package/src/tests/optimisticProxy.test.ts +860 -0
- package/src/tests/startUpdate.test.ts +7 -5
- package/src/tests/__isograph/Economist/__link/output_type.ts +0 -2
|
@@ -3,8 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.unretainQuery = unretainQuery;
|
|
4
4
|
exports.retainQuery = retainQuery;
|
|
5
5
|
exports.garbageCollectEnvironment = garbageCollectEnvironment;
|
|
6
|
+
exports.garbageCollectBaseStoreLayer = garbageCollectBaseStoreLayer;
|
|
6
7
|
const cache_1 = require("./cache");
|
|
7
8
|
const IsographEnvironment_1 = require("./IsographEnvironment");
|
|
9
|
+
const PromiseWrapper_1 = require("./PromiseWrapper");
|
|
10
|
+
function isRetainedQueryWithNormalizationAst(query) {
|
|
11
|
+
return (query.normalizationAst.result !== PromiseWrapper_1.NOT_SET &&
|
|
12
|
+
query.normalizationAst.result.kind === 'Ok');
|
|
13
|
+
}
|
|
8
14
|
function unretainQuery(environment, retainedQuery) {
|
|
9
15
|
environment.retainedQueries.delete(retainedQuery);
|
|
10
16
|
environment.gcBuffer.push(retainedQuery);
|
|
@@ -21,21 +27,37 @@ function retainQuery(environment, queryToRetain) {
|
|
|
21
27
|
// id + variables
|
|
22
28
|
}
|
|
23
29
|
function garbageCollectEnvironment(environment) {
|
|
24
|
-
|
|
30
|
+
if (environment.store.kind !== 'BaseStoreLayer') {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const retainedQueries = [];
|
|
25
34
|
for (const query of environment.retainedQueries) {
|
|
26
|
-
|
|
35
|
+
if (!isRetainedQueryWithNormalizationAst(query)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
retainedQueries.push(query);
|
|
27
39
|
}
|
|
28
40
|
for (const query of environment.gcBuffer) {
|
|
29
|
-
|
|
41
|
+
if (!isRetainedQueryWithNormalizationAst(query)) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
retainedQueries.push(query);
|
|
45
|
+
}
|
|
46
|
+
garbageCollectBaseStoreLayer(retainedQueries, environment.store);
|
|
47
|
+
}
|
|
48
|
+
function garbageCollectBaseStoreLayer(retainedQueries, baseStoreLayer) {
|
|
49
|
+
const retainedIds = {};
|
|
50
|
+
for (const query of retainedQueries) {
|
|
51
|
+
recordReachableIds(baseStoreLayer.data, query, retainedIds);
|
|
30
52
|
}
|
|
31
|
-
for (const typeName in
|
|
32
|
-
const dataById =
|
|
53
|
+
for (const typeName in baseStoreLayer.data) {
|
|
54
|
+
const dataById = baseStoreLayer.data[typeName];
|
|
33
55
|
if (dataById == null)
|
|
34
56
|
continue;
|
|
35
57
|
const retainedTypeIds = retainedIds[typeName];
|
|
36
58
|
// delete all objects
|
|
37
59
|
if (retainedTypeIds == undefined || retainedTypeIds.size == 0) {
|
|
38
|
-
delete
|
|
60
|
+
delete baseStoreLayer.data[typeName];
|
|
39
61
|
continue;
|
|
40
62
|
}
|
|
41
63
|
for (const dataId in dataById) {
|
|
@@ -44,21 +66,21 @@ function garbageCollectEnvironment(environment) {
|
|
|
44
66
|
}
|
|
45
67
|
}
|
|
46
68
|
if (Object.keys(dataById).length === 0) {
|
|
47
|
-
delete
|
|
69
|
+
delete baseStoreLayer.data[typeName];
|
|
48
70
|
}
|
|
49
71
|
}
|
|
50
72
|
}
|
|
51
|
-
function recordReachableIds(
|
|
73
|
+
function recordReachableIds(dataLayer, retainedQuery, mutableRetainedIds) {
|
|
52
74
|
var _a, _b;
|
|
53
75
|
var _c;
|
|
54
|
-
const record = (_a =
|
|
76
|
+
const record = (_a = dataLayer[retainedQuery.root.__typename]) === null || _a === void 0 ? void 0 : _a[retainedQuery.root.__link];
|
|
55
77
|
const retainedRecordsIds = ((_b = mutableRetainedIds[_c = retainedQuery.root.__typename]) !== null && _b !== void 0 ? _b : (mutableRetainedIds[_c] = new Set()));
|
|
56
78
|
retainedRecordsIds.add(retainedQuery.root.__link);
|
|
57
79
|
if (record) {
|
|
58
|
-
recordReachableIdsFromRecord(
|
|
80
|
+
recordReachableIdsFromRecord(dataLayer, record, mutableRetainedIds, retainedQuery.normalizationAst.result.value.selections, retainedQuery.variables);
|
|
59
81
|
}
|
|
60
82
|
}
|
|
61
|
-
function recordReachableIdsFromRecord(
|
|
83
|
+
function recordReachableIdsFromRecord(dataLayer, currentRecord, mutableRetainedIds, selections, variables) {
|
|
62
84
|
var _a;
|
|
63
85
|
for (const selection of selections) {
|
|
64
86
|
switch (selection.kind) {
|
|
@@ -81,14 +103,14 @@ function recordReachableIdsFromRecord(store, currentRecord, mutableRetainedIds,
|
|
|
81
103
|
}
|
|
82
104
|
}
|
|
83
105
|
let typeStore = selection.concreteType !== null
|
|
84
|
-
?
|
|
106
|
+
? dataLayer[selection.concreteType]
|
|
85
107
|
: null;
|
|
86
108
|
if (typeStore == null && selection.concreteType !== null) {
|
|
87
109
|
continue;
|
|
88
110
|
}
|
|
89
111
|
for (const nextRecordLink of links) {
|
|
90
112
|
let __typename = nextRecordLink.__typename;
|
|
91
|
-
const resolvedTypeStore = typeStore !== null && typeStore !== void 0 ? typeStore :
|
|
113
|
+
const resolvedTypeStore = typeStore !== null && typeStore !== void 0 ? typeStore : dataLayer[__typename];
|
|
92
114
|
if (resolvedTypeStore == null) {
|
|
93
115
|
continue;
|
|
94
116
|
}
|
|
@@ -96,7 +118,7 @@ function recordReachableIdsFromRecord(store, currentRecord, mutableRetainedIds,
|
|
|
96
118
|
if (nextRecord != null) {
|
|
97
119
|
const retainedRecordsIds = ((_a = mutableRetainedIds[__typename]) !== null && _a !== void 0 ? _a : (mutableRetainedIds[__typename] = new Set()));
|
|
98
120
|
retainedRecordsIds.add(nextRecordLink.__link);
|
|
99
|
-
recordReachableIdsFromRecord(
|
|
121
|
+
recordReachableIdsFromRecord(dataLayer, nextRecord, mutableRetainedIds, selection.selections, variables);
|
|
100
122
|
}
|
|
101
123
|
}
|
|
102
124
|
continue;
|
package/dist/core/logging.d.ts
CHANGED
|
@@ -3,9 +3,22 @@ import { NetworkResponseObject, type EncounteredIds } from './cache';
|
|
|
3
3
|
import { CheckResult } from './check';
|
|
4
4
|
import { IsographEntrypoint, RefetchQueryNormalizationArtifact, type NormalizationAstNodes } from './entrypoint';
|
|
5
5
|
import { FragmentReference, Variables } from './FragmentReference';
|
|
6
|
-
import { IsographEnvironment,
|
|
6
|
+
import { IsographEnvironment, StoreRecord, type StoreLink } from './IsographEnvironment';
|
|
7
7
|
import { ReadDataResult } from './read';
|
|
8
8
|
import { Arguments } from './util';
|
|
9
|
+
import type { StoreLayer } from './optimisticProxy';
|
|
10
|
+
/**
|
|
11
|
+
* Note: these types are unstable. We will add and remove items from this enum
|
|
12
|
+
* and add and remove fields. Please do not rely on the specifics here (for now).
|
|
13
|
+
*
|
|
14
|
+
* Goals include:
|
|
15
|
+
* - convenient debugging for Isograph developers
|
|
16
|
+
* - eventual support for the Isograph devtools
|
|
17
|
+
*
|
|
18
|
+
* In some cases (e.g. in `AfterNormalization`), we include large objects and thus
|
|
19
|
+
* prevent them from getting garbage collected (if the log message is printed).
|
|
20
|
+
* Especially in cases like that, we intend to remove those!
|
|
21
|
+
*/
|
|
9
22
|
export type LogMessage = {
|
|
10
23
|
kind: 'AboutToNormalize';
|
|
11
24
|
normalizationAst: NormalizationAstNodes;
|
|
@@ -13,7 +26,7 @@ export type LogMessage = {
|
|
|
13
26
|
variables: Variables;
|
|
14
27
|
} | {
|
|
15
28
|
kind: 'AfterNormalization';
|
|
16
|
-
store:
|
|
29
|
+
store: StoreLayer;
|
|
17
30
|
encounteredIds: EncounteredIds;
|
|
18
31
|
} | {
|
|
19
32
|
kind: 'DeepEqualityCheck';
|
|
@@ -27,7 +40,7 @@ export type LogMessage = {
|
|
|
27
40
|
rootLink: StoreLink;
|
|
28
41
|
} | {
|
|
29
42
|
kind: 'MakeNetworkRequest';
|
|
30
|
-
artifact: RefetchQueryNormalizationArtifact | IsographEntrypoint<any, any, any>;
|
|
43
|
+
artifact: RefetchQueryNormalizationArtifact | IsographEntrypoint<any, any, any, any>;
|
|
31
44
|
variables: Variables;
|
|
32
45
|
networkRequestId: string;
|
|
33
46
|
} | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/core/logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,iCAAiC,EACjC,KAAK,qBAAqB,EAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/core/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { ItemCleanupPair } from '@isograph/disposable-types';
|
|
2
|
+
import { type NetworkResponseObject } from './cache';
|
|
2
3
|
import { FetchOptions } from './check';
|
|
3
4
|
import { IsographEntrypoint, ReaderWithRefetchQueries, RefetchQueryNormalizationArtifact, type NormalizationAst, type NormalizationAstLoader } from './entrypoint';
|
|
4
5
|
import { ExtractParameters, type UnknownTReadFromStore } from './FragmentReference';
|
|
5
6
|
import { IsographEnvironment } from './IsographEnvironment';
|
|
6
7
|
import { AnyError, PromiseWrapper } from './PromiseWrapper';
|
|
7
|
-
export declare function maybeMakeNetworkRequest<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue,
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function maybeMakeNetworkRequest<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader, TRawResponseType extends NetworkResponseObject>(environment: IsographEnvironment, artifact: RefetchQueryNormalizationArtifact | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst, TRawResponseType>, variables: ExtractParameters<TReadFromStore>, readerWithRefetchQueries: PromiseWrapper<ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>> | null, fetchOptions: FetchOptions<TClientFieldValue, TRawResponseType> | null): ItemCleanupPair<PromiseWrapper<void, AnyError>>;
|
|
9
|
+
export declare function retainQueryWithoutMakingNetworkRequest<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TRawResponseType extends NetworkResponseObject>(environment: IsographEnvironment, artifact: RefetchQueryNormalizationArtifact | IsographEntrypoint<TReadFromStore, TClientFieldValue, NormalizationAst | NormalizationAstLoader, TRawResponseType>, variables: ExtractParameters<TReadFromStore>): ItemCleanupPair<PromiseWrapper<void, AnyError>>;
|
|
10
|
+
export declare function makeNetworkRequest<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader, TRawResponseType extends NetworkResponseObject>(environment: IsographEnvironment, artifact: RefetchQueryNormalizationArtifact | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst, TRawResponseType>, variables: ExtractParameters<TReadFromStore>, readerWithRefetchQueries: PromiseWrapper<ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>> | null, fetchOptions: FetchOptions<TClientFieldValue, TRawResponseType> | null): ItemCleanupPair<PromiseWrapper<void, AnyError>>;
|
|
9
11
|
//# sourceMappingURL=makeNetworkRequest.d.ts.map
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"makeNetworkRequest.d.ts","sourceRoot":"","sources":["../../src/core/makeNetworkRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,SAAS,CAAC;AACjB,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;AAShF,OAAO,EACL,QAAQ,EACR,cAAc,EAGf,MAAM,kBAAkB,CAAC;AAM1B,wBAAgB,uBAAuB,CACrC,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EACjB,iBAAiB,SAAS,gBAAgB,GAAG,sBAAsB,EACnE,gBAAgB,SAAS,qBAAqB,EAE9C,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EACJ,iCAAiC,GACjC,kBAAkB,CAChB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,CACjB,EACL,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,EAAE,gBAAgB,CAAC,GAAG,IAAI,GACrE,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAuDjD;AAED,wBAAgB,sCAAsC,CACpD,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EACjB,gBAAgB,SAAS,qBAAqB,EAE9C,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EACJ,iCAAiC,GACjC,kBAAkB,CAChB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GAAG,sBAAsB,EACzC,gBAAgB,CACjB,EACL,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,GAC3C,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAmBjD;AAED,wBAAgB,kBAAkB,CAChC,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EACjB,iBAAiB,SAAS,gBAAgB,GAAG,sBAAsB,EACnE,gBAAgB,SAAS,qBAAqB,EAE9C,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EACJ,iCAAiC,GACjC,kBAAkB,CAChB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,CACjB,EACL,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,EAAE,gBAAgB,CAAC,GAAG,IAAI,GACrE,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAiKjD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.maybeMakeNetworkRequest = maybeMakeNetworkRequest;
|
|
4
|
+
exports.retainQueryWithoutMakingNetworkRequest = retainQueryWithoutMakingNetworkRequest;
|
|
4
5
|
exports.makeNetworkRequest = makeNetworkRequest;
|
|
5
6
|
const cache_1 = require("./cache");
|
|
6
7
|
const check_1 = require("./check");
|
|
@@ -8,6 +9,7 @@ const componentCache_1 = require("./componentCache");
|
|
|
8
9
|
const garbageCollection_1 = require("./garbageCollection");
|
|
9
10
|
const IsographEnvironment_1 = require("./IsographEnvironment");
|
|
10
11
|
const logging_1 = require("./logging");
|
|
12
|
+
const optimisticProxy_1 = require("./optimisticProxy");
|
|
11
13
|
const PromiseWrapper_1 = require("./PromiseWrapper");
|
|
12
14
|
const read_1 = require("./read");
|
|
13
15
|
const startUpdate_1 = require("./startUpdate");
|
|
@@ -19,19 +21,20 @@ function maybeMakeNetworkRequest(environment, artifact, variables, readerWithRef
|
|
|
19
21
|
return makeNetworkRequest(environment, artifact, variables, readerWithRefetchQueries, fetchOptions);
|
|
20
22
|
}
|
|
21
23
|
case 'No': {
|
|
22
|
-
return
|
|
24
|
+
return retainQueryWithoutMakingNetworkRequest(environment, artifact, variables);
|
|
23
25
|
}
|
|
24
26
|
case 'IfNecessary': {
|
|
25
27
|
if (artifact.networkRequestInfo.normalizationAst.kind ===
|
|
26
28
|
'NormalizationAstLoader') {
|
|
27
|
-
throw new Error('Using lazy loaded normalizationAst with shouldFetch: "IfNecessary" is
|
|
29
|
+
throw new Error('Using lazy loaded normalizationAst with shouldFetch: "IfNecessary" is ' +
|
|
30
|
+
'not supported as it will lead to a network waterfall.');
|
|
28
31
|
}
|
|
29
32
|
const result = (0, check_1.check)(environment, artifact.networkRequestInfo.normalizationAst.selections, variables, {
|
|
30
33
|
__link: IsographEnvironment_1.ROOT_ID,
|
|
31
34
|
__typename: artifact.concreteType,
|
|
32
35
|
});
|
|
33
36
|
if (result.kind === 'EnoughData') {
|
|
34
|
-
return
|
|
37
|
+
return retainQueryWithoutMakingNetworkRequest(environment, artifact, variables);
|
|
35
38
|
}
|
|
36
39
|
else {
|
|
37
40
|
return makeNetworkRequest(environment, artifact, variables, readerWithRefetchQueries, fetchOptions);
|
|
@@ -39,33 +42,41 @@ function maybeMakeNetworkRequest(environment, artifact, variables, readerWithRef
|
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
44
|
}
|
|
42
|
-
function
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
function retainQueryWithoutMakingNetworkRequest(environment, artifact, variables) {
|
|
46
|
+
let status = {
|
|
47
|
+
kind: 'UndisposedComplete',
|
|
48
|
+
retainedQuery: fetchNormalizationAstAndRetainArtifact(environment, artifact, variables),
|
|
49
|
+
};
|
|
50
|
+
return [
|
|
51
|
+
(0, PromiseWrapper_1.wrapResolvedValue)(undefined),
|
|
52
|
+
() => {
|
|
53
|
+
if (status.kind !== 'Disposed') {
|
|
54
|
+
status = unretainAndGarbageCollect(environment, status);
|
|
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: 'UndisposedIncomplete',
|
|
65
|
+
retainedQuery: fetchNormalizationAstAndRetainArtifact(environment, artifact, variables),
|
|
66
|
+
optimistic: (fetchOptions === null || fetchOptions === void 0 ? void 0 : fetchOptions.optimisticNetworkResponse) != null
|
|
67
|
+
? makeOptimisticUpdate(environment, artifact, variables, fetchOptions === null || fetchOptions === void 0 ? void 0 : fetchOptions.optimisticNetworkResponse)
|
|
68
|
+
: null,
|
|
69
|
+
};
|
|
56
70
|
(0, logging_1.logMessage)(environment, () => ({
|
|
57
71
|
kind: 'MakeNetworkRequest',
|
|
58
72
|
artifact,
|
|
59
73
|
variables,
|
|
60
74
|
networkRequestId: myNetworkRequestId,
|
|
61
75
|
}));
|
|
62
|
-
let status = {
|
|
63
|
-
kind: 'UndisposedIncomplete',
|
|
64
|
-
};
|
|
65
76
|
// This should be an observable, not a promise
|
|
66
77
|
const promise = Promise.all([
|
|
67
78
|
environment.networkFunction(artifact.networkRequestInfo.operation, variables),
|
|
68
|
-
|
|
79
|
+
status.retainedQuery.normalizationAst.promise,
|
|
69
80
|
readerWithRefetchQueries === null || readerWithRefetchQueries === void 0 ? void 0 : readerWithRefetchQueries.promise,
|
|
70
81
|
])
|
|
71
82
|
.then(([networkResponse, normalizationAst, readerWithRefetchQueries]) => {
|
|
@@ -80,23 +91,34 @@ function makeNetworkRequest(environment, artifact, variables, readerWithRefetchQ
|
|
|
80
91
|
(_a = fetchOptions === null || fetchOptions === void 0 ? void 0 : fetchOptions.onError) === null || _a === void 0 ? void 0 : _a.call(fetchOptions);
|
|
81
92
|
}
|
|
82
93
|
catch (_c) { }
|
|
83
|
-
throw new Error('
|
|
94
|
+
throw new Error('Network response had errors', {
|
|
84
95
|
cause: networkResponse,
|
|
85
96
|
});
|
|
86
97
|
}
|
|
87
98
|
const root = { __link: IsographEnvironment_1.ROOT_ID, __typename: artifact.concreteType };
|
|
88
99
|
if (status.kind === 'UndisposedIncomplete') {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
+
if (status.optimistic != null) {
|
|
101
|
+
status =
|
|
102
|
+
revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(environment, status, (storeLayer) => {
|
|
103
|
+
var _a;
|
|
104
|
+
return (0, cache_1.normalizeData)(environment, storeLayer, normalizationAst.selections, (_a = networkResponse.data) !== null && _a !== void 0 ? _a : {}, variables, root, new Map());
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const encounteredIds = new Map();
|
|
109
|
+
environment.store = (0, optimisticProxy_1.addNetworkResponseStoreLayer)(environment.store);
|
|
110
|
+
(0, cache_1.normalizeData)(environment, environment.store, normalizationAst.selections, (_b = networkResponse.data) !== null && _b !== void 0 ? _b : {}, variables, root, encounteredIds);
|
|
111
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
112
|
+
kind: 'AfterNormalization',
|
|
113
|
+
store: environment.store,
|
|
114
|
+
encounteredIds: encounteredIds,
|
|
115
|
+
}));
|
|
116
|
+
(0, cache_1.callSubscriptions)(environment, encounteredIds);
|
|
117
|
+
status = {
|
|
118
|
+
kind: 'UndisposedComplete',
|
|
119
|
+
retainedQuery: status.retainedQuery,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
100
122
|
}
|
|
101
123
|
const onComplete = fetchOptions === null || fetchOptions === void 0 ? void 0 : fetchOptions.onComplete;
|
|
102
124
|
if (onComplete != null) {
|
|
@@ -122,21 +144,23 @@ function makeNetworkRequest(environment, artifact, variables, readerWithRefetchQ
|
|
|
122
144
|
(_a = fetchOptions === null || fetchOptions === void 0 ? void 0 : fetchOptions.onError) === null || _a === void 0 ? void 0 : _a.call(fetchOptions);
|
|
123
145
|
}
|
|
124
146
|
catch (_b) { }
|
|
147
|
+
if (status.kind === 'UndisposedIncomplete') {
|
|
148
|
+
status =
|
|
149
|
+
revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(environment, status, null);
|
|
150
|
+
}
|
|
125
151
|
throw e;
|
|
126
152
|
});
|
|
127
153
|
const wrapper = (0, PromiseWrapper_1.wrapPromise)(promise);
|
|
128
154
|
const response = [
|
|
129
155
|
wrapper,
|
|
130
156
|
() => {
|
|
131
|
-
if (status.kind === '
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
157
|
+
if (status.kind === 'UndisposedIncomplete') {
|
|
158
|
+
status =
|
|
159
|
+
revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(environment, status, null);
|
|
160
|
+
}
|
|
161
|
+
if (status.kind !== 'Disposed') {
|
|
162
|
+
status = unretainAndGarbageCollect(environment, status);
|
|
136
163
|
}
|
|
137
|
-
status = {
|
|
138
|
-
kind: 'Disposed',
|
|
139
|
-
};
|
|
140
164
|
},
|
|
141
165
|
];
|
|
142
166
|
return response;
|
|
@@ -162,6 +186,8 @@ function readDataForOnComplete(artifact, environment, root, variables, readerWit
|
|
|
162
186
|
kind: 'FragmentReference',
|
|
163
187
|
// TODO this smells.
|
|
164
188
|
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)(resolvedReaderWithRefetchQueries),
|
|
189
|
+
fieldName: resolvedReaderWithRefetchQueries.readerArtifact.fieldName,
|
|
190
|
+
readerArtifactKind: resolvedReaderWithRefetchQueries.readerArtifact.kind,
|
|
165
191
|
root,
|
|
166
192
|
variables,
|
|
167
193
|
networkRequest: fakeNetworkRequest,
|
|
@@ -173,13 +199,15 @@ function readDataForOnComplete(artifact, environment, root, variables, readerWit
|
|
|
173
199
|
// @ts-expect-error We should find a way to encode this in the type system:
|
|
174
200
|
// if we have a ComponentReaderArtifact, we will necessarily have a
|
|
175
201
|
// TClientFieldValue which is a React.FC<...>
|
|
176
|
-
return (0, componentCache_1.getOrCreateCachedComponent)(environment,
|
|
202
|
+
return (0, componentCache_1.getOrCreateCachedComponent)(environment, {
|
|
177
203
|
kind: 'FragmentReference',
|
|
178
204
|
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
|
|
179
205
|
kind: 'ReaderWithRefetchQueries',
|
|
180
206
|
readerArtifact: readerArtifact,
|
|
181
207
|
nestedRefetchQueries: resolvedReaderWithRefetchQueries.nestedRefetchQueries,
|
|
182
208
|
}),
|
|
209
|
+
fieldName: readerArtifact.fieldName,
|
|
210
|
+
readerArtifactKind: readerArtifact.kind,
|
|
183
211
|
root,
|
|
184
212
|
variables,
|
|
185
213
|
networkRequest: fakeNetworkRequest,
|
|
@@ -188,7 +216,7 @@ function readDataForOnComplete(artifact, environment, root, variables, readerWit
|
|
|
188
216
|
case 'EagerReaderArtifact': {
|
|
189
217
|
return readerArtifact.resolver(Object.assign({ data: fragmentResult, parameters: variables }, (readerArtifact.hasUpdatable
|
|
190
218
|
? {
|
|
191
|
-
startUpdate: (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment,
|
|
219
|
+
startUpdate: (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment, fakeNetworkRequestOptions),
|
|
192
220
|
}
|
|
193
221
|
: undefined)));
|
|
194
222
|
}
|
|
@@ -201,3 +229,52 @@ function readDataForOnComplete(artifact, environment, root, variables, readerWit
|
|
|
201
229
|
}
|
|
202
230
|
return null;
|
|
203
231
|
}
|
|
232
|
+
function fetchNormalizationAstAndRetainArtifact(environment, artifact, variables) {
|
|
233
|
+
const normalizationAst = artifact.networkRequestInfo.normalizationAst.kind === 'NormalizationAst'
|
|
234
|
+
? (0, PromiseWrapper_1.wrapResolvedValue)(artifact.networkRequestInfo.normalizationAst)
|
|
235
|
+
: (0, PromiseWrapper_1.wrapPromise)(artifact.networkRequestInfo.normalizationAst.loader());
|
|
236
|
+
const root = { __link: IsographEnvironment_1.ROOT_ID, __typename: artifact.concreteType };
|
|
237
|
+
const retainedQuery = {
|
|
238
|
+
normalizationAst: normalizationAst,
|
|
239
|
+
variables,
|
|
240
|
+
root,
|
|
241
|
+
};
|
|
242
|
+
(0, garbageCollection_1.retainQuery)(environment, retainedQuery);
|
|
243
|
+
return retainedQuery;
|
|
244
|
+
}
|
|
245
|
+
function makeOptimisticUpdate(environment, artifact, variables, optimisticNetworkResponse) {
|
|
246
|
+
const root = { __link: IsographEnvironment_1.ROOT_ID, __typename: artifact.concreteType };
|
|
247
|
+
if (artifact.networkRequestInfo.normalizationAst.kind ===
|
|
248
|
+
'NormalizationAstLoader') {
|
|
249
|
+
throw new Error('Using lazy loaded normalizationAst with optimisticNetworkResponse is not supported.');
|
|
250
|
+
}
|
|
251
|
+
const encounteredIds = new Map();
|
|
252
|
+
const optimistic = (environment.store =
|
|
253
|
+
(0, optimisticProxy_1.addOptimisticNetworkResponseStoreLayer)(environment.store));
|
|
254
|
+
(0, cache_1.normalizeData)(environment, environment.store, artifact.networkRequestInfo.normalizationAst.selections, optimisticNetworkResponse, variables, root, encounteredIds);
|
|
255
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
256
|
+
kind: 'AfterNormalization',
|
|
257
|
+
store: environment.store,
|
|
258
|
+
encounteredIds: encounteredIds,
|
|
259
|
+
}));
|
|
260
|
+
(0, cache_1.callSubscriptions)(environment, encounteredIds);
|
|
261
|
+
return optimistic;
|
|
262
|
+
}
|
|
263
|
+
function revertOptimisticStoreLayerAndMaybeReplaceIfUndisposedIncomplete(environment, status, normalizeData) {
|
|
264
|
+
if (status.optimistic) {
|
|
265
|
+
(0, optimisticProxy_1.revertOptimisticStoreLayerAndMaybeReplace)(environment, status.optimistic, normalizeData);
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
kind: 'UndisposedComplete',
|
|
269
|
+
retainedQuery: status.retainedQuery,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function unretainAndGarbageCollect(environment, status) {
|
|
273
|
+
const didUnretainSomeQuery = (0, garbageCollection_1.unretainQuery)(environment, status.retainedQuery);
|
|
274
|
+
if (didUnretainSomeQuery) {
|
|
275
|
+
(0, garbageCollection_1.garbageCollectEnvironment)(environment);
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
kind: 'Disposed',
|
|
279
|
+
};
|
|
280
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { BaseStoreLayerData, IsographEnvironment, StoreLayerData, StoreLink, StoreRecord } from './IsographEnvironment';
|
|
2
|
+
export declare function getOrInsertRecord(dataLayer: StoreLayerData, link: StoreLink): StoreRecord;
|
|
3
|
+
/**
|
|
4
|
+
* Given the child-most store layer (i.e. environment.store) and a link (identifying a
|
|
5
|
+
* store record), create a proxy object that attempts to read through each successive
|
|
6
|
+
* store layer until a value (i.e. field name) is found. If found, return that value.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getStoreRecordProxy(storeLayer: StoreLayer, link: StoreLink): Readonly<StoreRecord> | null | undefined;
|
|
9
|
+
export declare function getMutableStoreRecordProxy(childMostStoreLayer: StoreLayer, link: StoreLink): StoreRecord;
|
|
10
|
+
export type BaseStoreLayer = {
|
|
11
|
+
readonly kind: 'BaseStoreLayer';
|
|
12
|
+
childStoreLayer: OptimisticStoreLayer | null;
|
|
13
|
+
readonly parentStoreLayer: null;
|
|
14
|
+
readonly data: BaseStoreLayerData;
|
|
15
|
+
};
|
|
16
|
+
export type NetworkResponseStoreLayer = {
|
|
17
|
+
readonly kind: 'NetworkResponseStoreLayer';
|
|
18
|
+
childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | null;
|
|
19
|
+
parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer;
|
|
20
|
+
readonly data: StoreLayerData;
|
|
21
|
+
};
|
|
22
|
+
export type DataUpdate<TStoreLayer extends StoreLayer> = (storeLayer: TStoreLayer) => void;
|
|
23
|
+
export type StartUpdateStoreLayer = {
|
|
24
|
+
readonly kind: 'StartUpdateStoreLayer';
|
|
25
|
+
childStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer | null;
|
|
26
|
+
parentStoreLayer: OptimisticStoreLayer | NetworkResponseStoreLayer;
|
|
27
|
+
data: StoreLayerData;
|
|
28
|
+
startUpdate: DataUpdate<StartUpdateStoreLayer | BaseStoreLayer>;
|
|
29
|
+
};
|
|
30
|
+
export type OptimisticStoreLayer = OptimisticUpdaterStoreLayer | OptimisticNetworkResponseStoreLayer;
|
|
31
|
+
export type OptimisticUpdaterStoreLayer = {
|
|
32
|
+
readonly kind: 'OptimisticUpdaterStoreLayer';
|
|
33
|
+
childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | null;
|
|
34
|
+
parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | BaseStoreLayer;
|
|
35
|
+
data: StoreLayerData;
|
|
36
|
+
readonly startUpdate: DataUpdate<OptimisticUpdaterStoreLayer>;
|
|
37
|
+
};
|
|
38
|
+
export type OptimisticNetworkResponseStoreLayer = {
|
|
39
|
+
readonly kind: 'OptimisticNetworkResponseStoreLayer';
|
|
40
|
+
childStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | null;
|
|
41
|
+
parentStoreLayer: OptimisticStoreLayer | StartUpdateStoreLayer | NetworkResponseStoreLayer | BaseStoreLayer;
|
|
42
|
+
data: StoreLayerData;
|
|
43
|
+
};
|
|
44
|
+
export declare function addNetworkResponseStoreLayer(parent: StoreLayer): StoreLayerWithData;
|
|
45
|
+
export declare function addStartUpdateStoreLayer(parent: StoreLayer, startUpdate: StartUpdateStoreLayer['startUpdate']): StoreLayer;
|
|
46
|
+
export declare function addOptimisticUpdaterStoreLayer(parent: StoreLayer, startUpdate: OptimisticUpdaterStoreLayer['startUpdate']): OptimisticUpdaterStoreLayer;
|
|
47
|
+
export declare function addOptimisticNetworkResponseStoreLayer(parent: StoreLayer): OptimisticNetworkResponseStoreLayer;
|
|
48
|
+
/**
|
|
49
|
+
* Remove an optimistic store layer from the stack, potentially replacing it
|
|
50
|
+
* with a network response.
|
|
51
|
+
*
|
|
52
|
+
* After we do this, we must re-execute all child startUpdate and optimistic
|
|
53
|
+
* layers (since their data may have changed.) We also keep track of changed
|
|
54
|
+
* records, in order to call affected subscriptions.
|
|
55
|
+
*/
|
|
56
|
+
export declare function revertOptimisticStoreLayerAndMaybeReplace(environment: IsographEnvironment, optimisticNode: OptimisticStoreLayer, normalizeData: null | ((storeLayer: StoreLayerWithData) => void)): void;
|
|
57
|
+
export type StoreLayer = OptimisticStoreLayer | NetworkResponseStoreLayer | StartUpdateStoreLayer | BaseStoreLayer;
|
|
58
|
+
export type StoreLayerWithData = BaseStoreLayer | NetworkResponseStoreLayer | OptimisticNetworkResponseStoreLayer;
|
|
59
|
+
//# sourceMappingURL=optimisticProxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimisticProxy.d.ts","sourceRoot":"","sources":["../../src/core/optimisticProxy.ts"],"names":[],"mappings":"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"}
|