@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.
Files changed (137) hide show
  1. package/.turbo/turbo-compile-libs.log +2 -2
  2. package/dist/core/FragmentReference.d.ts +4 -2
  3. package/dist/core/FragmentReference.d.ts.map +1 -1
  4. package/dist/core/FragmentReference.js +2 -2
  5. package/dist/core/IsographEnvironment.d.ts +19 -11
  6. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  7. package/dist/core/IsographEnvironment.js +27 -2
  8. package/dist/core/PromiseWrapper.d.ts +13 -7
  9. package/dist/core/PromiseWrapper.d.ts.map +1 -1
  10. package/dist/core/brand.d.ts +17 -0
  11. package/dist/core/brand.d.ts.map +1 -1
  12. package/dist/core/cache.d.ts +10 -7
  13. package/dist/core/cache.d.ts.map +1 -1
  14. package/dist/core/cache.js +102 -74
  15. package/dist/core/check.d.ts +8 -4
  16. package/dist/core/check.d.ts.map +1 -1
  17. package/dist/core/check.js +10 -7
  18. package/dist/core/componentCache.d.ts +1 -1
  19. package/dist/core/componentCache.d.ts.map +1 -1
  20. package/dist/core/componentCache.js +6 -4
  21. package/dist/core/entrypoint.d.ts +17 -7
  22. package/dist/core/entrypoint.d.ts.map +1 -1
  23. package/dist/core/garbageCollection.d.ts +8 -2
  24. package/dist/core/garbageCollection.d.ts.map +1 -1
  25. package/dist/core/garbageCollection.js +36 -14
  26. package/dist/core/logging.d.ts +16 -3
  27. package/dist/core/logging.d.ts.map +1 -1
  28. package/dist/core/makeNetworkRequest.d.ts +4 -2
  29. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  30. package/dist/core/makeNetworkRequest.js +115 -38
  31. package/dist/core/optimisticProxy.d.ts +59 -0
  32. package/dist/core/optimisticProxy.d.ts.map +1 -0
  33. package/dist/core/optimisticProxy.js +399 -0
  34. package/dist/core/read.d.ts +3 -2
  35. package/dist/core/read.d.ts.map +1 -1
  36. package/dist/core/read.js +158 -123
  37. package/dist/core/reader.d.ts +7 -4
  38. package/dist/core/reader.d.ts.map +1 -1
  39. package/dist/core/startUpdate.d.ts +3 -2
  40. package/dist/core/startUpdate.d.ts.map +1 -1
  41. package/dist/core/startUpdate.js +33 -34
  42. package/dist/index.d.ts +2 -2
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -1
  45. package/dist/loadable-hooks/useClientSideDefer.d.ts +9 -4
  46. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  47. package/dist/loadable-hooks/useClientSideDefer.js +34 -1
  48. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +5 -3
  49. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  50. package/dist/loadable-hooks/useConnectionSpecPagination.js +27 -13
  51. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +1 -1
  52. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
  53. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +1 -1
  54. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  55. package/dist/loadable-hooks/useSkipLimitPagination.js +1 -1
  56. package/dist/react/FragmentReader.d.ts +2 -1
  57. package/dist/react/FragmentReader.d.ts.map +1 -1
  58. package/dist/react/FragmentRenderer.d.ts +2 -1
  59. package/dist/react/FragmentRenderer.d.ts.map +1 -1
  60. package/dist/react/LoadableFieldReader.d.ts +9 -3
  61. package/dist/react/LoadableFieldReader.d.ts.map +1 -1
  62. package/dist/react/LoadableFieldReader.js +40 -1
  63. package/dist/react/LoadableFieldRenderer.d.ts +9 -3
  64. package/dist/react/LoadableFieldRenderer.d.ts.map +1 -1
  65. package/dist/react/LoadableFieldRenderer.js +36 -1
  66. package/dist/react/useImperativeReference.d.ts +4 -3
  67. package/dist/react/useImperativeReference.d.ts.map +1 -1
  68. package/dist/react/useImperativeReference.js +3 -5
  69. package/dist/react/useLazyReference.d.ts +2 -1
  70. package/dist/react/useLazyReference.d.ts.map +1 -1
  71. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  72. package/dist/react/useReadAndSubscribe.js +1 -3
  73. package/dist/react/useResult.d.ts.map +1 -1
  74. package/dist/react/useResult.js +6 -5
  75. package/package.json +16 -17
  76. package/src/core/FragmentReference.ts +10 -4
  77. package/src/core/IsographEnvironment.ts +59 -13
  78. package/src/core/PromiseWrapper.ts +14 -7
  79. package/src/core/brand.ts +18 -0
  80. package/src/core/cache.ts +186 -91
  81. package/src/core/check.ts +21 -10
  82. package/src/core/componentCache.ts +8 -4
  83. package/src/core/entrypoint.ts +35 -6
  84. package/src/core/garbageCollection.ts +61 -19
  85. package/src/core/logging.ts +15 -3
  86. package/src/core/makeNetworkRequest.ts +307 -74
  87. package/src/core/optimisticProxy.ts +563 -0
  88. package/src/core/read.ts +233 -163
  89. package/src/core/reader.ts +10 -6
  90. package/src/core/startUpdate.ts +45 -30
  91. package/src/index.ts +2 -1
  92. package/src/loadable-hooks/useClientSideDefer.ts +76 -26
  93. package/src/loadable-hooks/useConnectionSpecPagination.ts +34 -17
  94. package/src/loadable-hooks/useImperativeLoadableField.ts +2 -2
  95. package/src/loadable-hooks/useSkipLimitPagination.ts +2 -3
  96. package/src/react/FragmentReader.tsx +3 -1
  97. package/src/react/FragmentRenderer.tsx +8 -1
  98. package/src/react/LoadableFieldReader.tsx +123 -12
  99. package/src/react/LoadableFieldRenderer.tsx +122 -12
  100. package/src/react/useImperativeReference.ts +20 -11
  101. package/src/react/useLazyReference.ts +17 -6
  102. package/src/react/useReadAndSubscribe.ts +1 -8
  103. package/src/react/useResult.ts +9 -11
  104. package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +1 -1
  105. package/src/tests/__isograph/Query/linkedUpdate/entrypoint.ts +3 -1
  106. package/src/tests/__isograph/Query/linkedUpdate/raw_response_type.ts +13 -0
  107. package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +1 -1
  108. package/src/tests/__isograph/Query/meName/entrypoint.ts +3 -1
  109. package/src/tests/__isograph/Query/meName/raw_response_type.ts +7 -0
  110. package/src/tests/__isograph/Query/meName/resolver_reader.ts +1 -1
  111. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +3 -1
  112. package/src/tests/__isograph/Query/meNameSuccessor/raw_response_type.ts +14 -0
  113. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +1 -1
  114. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +3 -1
  115. package/src/tests/__isograph/Query/nodeField/raw_response_type.ts +7 -0
  116. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +1 -1
  117. package/src/tests/__isograph/Query/normalizeUndefinedField/entrypoint.ts +33 -0
  118. package/src/tests/__isograph/Query/normalizeUndefinedField/normalization_ast.ts +25 -0
  119. package/src/tests/__isograph/Query/normalizeUndefinedField/output_type.ts +3 -0
  120. package/src/tests/__isograph/Query/normalizeUndefinedField/param_type.ts +9 -0
  121. package/src/tests/__isograph/Query/normalizeUndefinedField/query_text.ts +6 -0
  122. package/src/tests/__isograph/Query/normalizeUndefinedField/raw_response_type.ts +7 -0
  123. package/src/tests/__isograph/Query/normalizeUndefinedField/resolver_reader.ts +38 -0
  124. package/src/tests/__isograph/Query/startUpdate/entrypoint.ts +3 -1
  125. package/src/tests/__isograph/Query/startUpdate/raw_response_type.ts +8 -0
  126. package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +1 -1
  127. package/src/tests/__isograph/Query/subquery/entrypoint.ts +3 -1
  128. package/src/tests/__isograph/Query/subquery/raw_response_type.ts +9 -0
  129. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +1 -1
  130. package/src/tests/__isograph/iso.ts +11 -1
  131. package/src/tests/garbageCollection.test.ts +8 -5
  132. package/src/tests/meNameSuccessor.ts +6 -3
  133. package/src/tests/nodeQuery.ts +4 -2
  134. package/src/tests/normalizeData.test.ts +89 -15
  135. package/src/tests/optimisticProxy.test.ts +860 -0
  136. package/src/tests/startUpdate.test.ts +7 -5
  137. 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
- const retainedIds = {};
30
+ if (environment.store.kind !== 'BaseStoreLayer') {
31
+ return;
32
+ }
33
+ const retainedQueries = [];
25
34
  for (const query of environment.retainedQueries) {
26
- recordReachableIds(environment.store, query, retainedIds);
35
+ if (!isRetainedQueryWithNormalizationAst(query)) {
36
+ return;
37
+ }
38
+ retainedQueries.push(query);
27
39
  }
28
40
  for (const query of environment.gcBuffer) {
29
- recordReachableIds(environment.store, query, retainedIds);
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 environment.store) {
32
- const dataById = environment.store[typeName];
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 environment.store[typeName];
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 environment.store[typeName];
69
+ delete baseStoreLayer.data[typeName];
48
70
  }
49
71
  }
50
72
  }
51
- function recordReachableIds(store, retainedQuery, mutableRetainedIds) {
73
+ function recordReachableIds(dataLayer, retainedQuery, mutableRetainedIds) {
52
74
  var _a, _b;
53
75
  var _c;
54
- const record = (_a = store[retainedQuery.root.__typename]) === null || _a === void 0 ? void 0 : _a[retainedQuery.root.__link];
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(store, record, mutableRetainedIds, retainedQuery.normalizationAst, retainedQuery.variables);
80
+ recordReachableIdsFromRecord(dataLayer, record, mutableRetainedIds, retainedQuery.normalizationAst.result.value.selections, retainedQuery.variables);
59
81
  }
60
82
  }
61
- function recordReachableIdsFromRecord(store, currentRecord, mutableRetainedIds, selections, variables) {
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
- ? store[selection.concreteType]
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 : store[__typename];
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(store, nextRecord, mutableRetainedIds, selection.selections, variables);
121
+ recordReachableIdsFromRecord(dataLayer, nextRecord, mutableRetainedIds, selection.selections, variables);
100
122
  }
101
123
  }
102
124
  continue;
@@ -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, IsographStore, StoreRecord, type StoreLink } from './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: IsographStore;
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":"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"}
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, TArtifact extends RefetchQueryNormalizationArtifact | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>, TNormalizationAst extends NormalizationAst | NormalizationAstLoader>(environment: IsographEnvironment, artifact: TArtifact, variables: ExtractParameters<TReadFromStore>, readerWithRefetchQueries: PromiseWrapper<ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>> | null, fetchOptions: FetchOptions<TClientFieldValue> | null): ItemCleanupPair<PromiseWrapper<void, AnyError>>;
8
- export declare function makeNetworkRequest<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TArtifact extends RefetchQueryNormalizationArtifact | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>, TNormalizationAst extends NormalizationAst | NormalizationAstLoader>(environment: IsographEnvironment, artifact: TArtifact, variables: ExtractParameters<TReadFromStore>, readerWithRefetchQueries: PromiseWrapper<ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>> | null, fetchOptions: FetchOptions<TClientFieldValue> | null): ItemCleanupPair<PromiseWrapper<void, AnyError>>;
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;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,CA8CjD;AAeD,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,CAgHjD"}
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 [(0, PromiseWrapper_1.wrapResolvedValue)(undefined), () => { }];
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 not supported as it will lead to slower initial load time.');
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 [(0, PromiseWrapper_1.wrapResolvedValue)(undefined), () => { }];
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 loadNormalizationAst(normalizationAst) {
43
- switch (normalizationAst.kind) {
44
- case 'NormalizationAst': {
45
- return normalizationAst;
46
- }
47
- case 'NormalizationAstLoader': {
48
- return normalizationAst.loader();
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
- loadNormalizationAst(artifact.networkRequestInfo.normalizationAst),
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('GraphQL network response had errors', {
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
- (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
+ 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 === 'UndisposedComplete') {
132
- const didUnretainSomeQuery = (0, garbageCollection_1.unretainQuery)(environment, status.retainedQuery);
133
- if (didUnretainSomeQuery) {
134
- (0, garbageCollection_1.garbageCollectEnvironment)(environment);
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, readerArtifact.fieldName, {
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, resolvedReaderWithRefetchQueries.readerArtifact.fieldName, fakeNetworkRequestOptions),
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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"}