@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.
@@ -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-dd71e248 compile-libs /home/runner/work/isograph/isograph/libs/isograph-react
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":"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"}
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>): PromiseWrapper<T, never>;
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;IACX,KAAK,EAAE,CAAC,CAAC;CACV,GACD;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC;CACV,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,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,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAQ1B;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,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACrB,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
+ {"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 { NormalizationAstNodes } from './entrypoint';
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: NormalizationAstNodes;
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,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAGL,mBAAmB,EAGnB,KAAK,SAAS,EAEf,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B,CAAC;AAEF,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,QA+BzE"}
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
- recordReachableIds(environment.store, query, retainedIds);
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,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;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 [(0, PromiseWrapper_1.wrapResolvedValue)(undefined), () => { }];
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 [(0, PromiseWrapper_1.wrapResolvedValue)(undefined), () => { }];
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 loadNormalizationAst(normalizationAst) {
43
- switch (normalizationAst.kind) {
44
- case 'NormalizationAst': {
45
- return normalizationAst;
46
- }
47
- case 'NormalizationAstLoader': {
48
- return normalizationAst.loader();
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
- loadNormalizationAst(artifact.networkRequestInfo.normalizationAst),
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 === 'UndisposedIncomplete') {
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 === 'UndisposedComplete') {
132
- const didUnretainSomeQuery = (0, garbageCollection_1.unretainQuery)(environment, status.retainedQuery);
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-dd71e248",
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-dd71e248",
23
- "@isograph/react-disposable-state": "0.0.0-main-dd71e248",
24
- "@isograph/reference-counted-pointer": "0.0.0-main-dd71e248"
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
- ): PromiseWrapper<T, never> {
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: NormalizationAstNodes;
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
- recordReachableIds(environment.store, query, retainedIds);
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: 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 [wrapResolvedValue(undefined), () => {}];
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 [wrapResolvedValue(undefined), () => {}];
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 loadNormalizationAst(
100
- normalizationAst: NormalizationAstLoader | NormalizationAst,
101
- ) {
102
- switch (normalizationAst.kind) {
103
- case 'NormalizationAst': {
104
- return normalizationAst;
105
- }
106
- case 'NormalizationAstLoader': {
107
- return normalizationAst.loader();
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
- loadNormalizationAst(artifact.networkRequestInfo.normalizationAst),
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 === 'UndisposedIncomplete') {
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 === 'UndisposedComplete') {
225
- const didUnretainSomeQuery = unretainQuery(
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.selections,
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.selections,
19
+ export const meNameSuccessorRetainedQuery: RetainedQuery = {
20
+ normalizationAst: wrapResolvedValue(
21
+ meNameSuccessorEntrypoint.networkRequestInfo.normalizationAst,
22
+ ),
20
23
  variables: {},
21
24
  root: {
22
25
  __link: ROOT_ID,
@@ -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.selections,
17
+ normalizationAst: wrapResolvedValue(
18
+ nodeFieldEntrypoint.networkRequestInfo.normalizationAst,
19
+ ),
18
20
  variables: { id: 0 },
19
21
  root: { __link: ROOT_ID, __typename: 'Query' },
20
22
  };