@isograph/react 0.0.0-main-edade9ce → 0.0.0-main-d6741831

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.
@@ -25,8 +25,8 @@ type AnyRecordSubscription = {
25
25
  };
26
26
  type Subscription = FragmentSubscription<Object> | AnyRecordSubscription;
27
27
  type Subscriptions = Set<Subscription>;
28
- type SuspenseCache = {
29
- [index: string]: ParentCache<any>;
28
+ type CacheMap<T> = {
29
+ [index: string]: ParentCache<T>;
30
30
  };
31
31
  export type IsographEnvironment = {
32
32
  readonly store: IsographStore;
@@ -34,7 +34,7 @@ export type IsographEnvironment = {
34
34
  readonly missingFieldHandler: MissingFieldHandler | null;
35
35
  readonly componentCache: ComponentCache;
36
36
  readonly subscriptions: Subscriptions;
37
- readonly suspenseCache: SuspenseCache;
37
+ readonly fragmentCache: CacheMap<FragmentReference<any, any>>;
38
38
  readonly retainedQueries: Set<RetainedQuery>;
39
39
  readonly gcBuffer: Array<RetainedQuery>;
40
40
  readonly gcBufferSize: number;
@@ -10,7 +10,7 @@ function createIsographEnvironment(store, networkFunction, missingFieldHandler)
10
10
  missingFieldHandler: missingFieldHandler !== null && missingFieldHandler !== void 0 ? missingFieldHandler : null,
11
11
  componentCache: {},
12
12
  subscriptions: new Set(),
13
- suspenseCache: {},
13
+ fragmentCache: {},
14
14
  retainedQueries: new Set(),
15
15
  gcBuffer: [],
16
16
  gcBufferSize: DEFAULT_GC_BUFFER_SIZE,
@@ -1,5 +1,4 @@
1
1
  import { Factory, ParentCache } from '@isograph/react-disposable-state';
2
- import { AnyError, PromiseWrapper } from './PromiseWrapper';
3
2
  import { DataId, type IsographEnvironment } from './IsographEnvironment';
4
3
  import { IsographEntrypoint, NormalizationAst, NormalizationLinkedField, NormalizationScalarField, RefetchQueryNormalizationArtifactWrapper } from '../core/entrypoint';
5
4
  import { ReaderLinkedField, ReaderScalarField } from './reader';
@@ -10,14 +9,14 @@ declare global {
10
9
  __LOG: boolean;
11
10
  }
12
11
  }
13
- export declare function getOrCreateCache<T>(environment: IsographEnvironment, index: string, factory: Factory<T>): ParentCache<T>;
12
+ export declare function getOrCreateItemInSuspenseCache<TReadFromStore extends Object, TClientFieldValue>(environment: IsographEnvironment, index: string, factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>>;
14
13
  /**
15
14
  * Creates a copy of the provided value, ensuring any nested objects have their
16
15
  * keys sorted such that equivalent values would have identical JSON.stringify
17
16
  * results.
18
17
  */
19
18
  export declare function stableCopy<T>(value: T): T;
20
- export declare function getOrCreateCacheForArtifact<TReadFromStore extends Object, TClientFieldValue>(environment: IsographEnvironment, artifact: IsographEntrypoint<TReadFromStore, TClientFieldValue>, variables: Variables): ParentCache<PromiseWrapper<void, AnyError>>;
19
+ export declare function getOrCreateCacheForArtifact<TReadFromStore extends Object, TClientFieldValue>(environment: IsographEnvironment, entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue>, variables: Variables): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>>;
21
20
  type NetworkResponseScalarValue = string | number | boolean;
22
21
  type NetworkResponseValue = NetworkResponseScalarValue | null | NetworkResponseObject | NetworkResponseObject[] | NetworkResponseScalarValue[];
23
22
  type NetworkResponseObject = {
@@ -1,26 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SECOND_SPLIT_KEY = exports.FIRST_SPLIT_KEY = exports.getParentRecordKey = exports.onNextChange = exports.subscribe = exports.subscribeToAnyChange = exports.normalizeData = exports.getOrCreateCacheForArtifact = exports.stableCopy = exports.getOrCreateCache = void 0;
3
+ exports.SECOND_SPLIT_KEY = exports.FIRST_SPLIT_KEY = exports.getParentRecordKey = exports.onNextChange = exports.subscribe = exports.subscribeToAnyChange = exports.normalizeData = exports.getOrCreateCacheForArtifact = exports.stableCopy = exports.getOrCreateItemInSuspenseCache = void 0;
4
4
  const react_disposable_state_1 = require("@isograph/react-disposable-state");
5
5
  const IsographEnvironment_1 = require("./IsographEnvironment");
6
6
  const read_1 = require("./read");
7
7
  const areEqualWithDeepComparison_1 = require("./areEqualWithDeepComparison");
8
8
  const makeNetworkRequest_1 = require("./makeNetworkRequest");
9
9
  const TYPENAME_FIELD_NAME = '__typename';
10
- function getOrCreateCache(environment, index, factory) {
10
+ function getOrCreateItemInSuspenseCache(environment, index, factory) {
11
11
  if (typeof window !== 'undefined' && window.__LOG) {
12
12
  console.log('getting cache for', {
13
13
  index,
14
- cache: Object.keys(environment.suspenseCache),
15
- found: !!environment.suspenseCache[index],
14
+ cache: Object.keys(environment.fragmentCache),
15
+ found: !!environment.fragmentCache[index],
16
16
  });
17
17
  }
18
- if (environment.suspenseCache[index] == null) {
19
- environment.suspenseCache[index] = new react_disposable_state_1.ParentCache(factory);
18
+ if (environment.fragmentCache[index] == null) {
19
+ environment.fragmentCache[index] = new react_disposable_state_1.ParentCache(factory);
20
20
  }
21
- return environment.suspenseCache[index];
21
+ return environment.fragmentCache[index];
22
22
  }
23
- exports.getOrCreateCache = getOrCreateCache;
23
+ exports.getOrCreateItemInSuspenseCache = getOrCreateItemInSuspenseCache;
24
24
  /**
25
25
  * Creates a copy of the provided value, ensuring any nested objects have their
26
26
  * keys sorted such that equivalent values would have identical JSON.stringify
@@ -43,10 +43,24 @@ function stableCopy(value) {
43
43
  return stable;
44
44
  }
45
45
  exports.stableCopy = stableCopy;
46
- function getOrCreateCacheForArtifact(environment, artifact, variables) {
47
- const cacheKey = artifact.queryText + JSON.stringify(stableCopy(variables));
48
- const factory = () => (0, makeNetworkRequest_1.makeNetworkRequest)(environment, artifact, variables);
49
- return getOrCreateCache(environment, cacheKey, factory);
46
+ function getOrCreateCacheForArtifact(environment, entrypoint, variables) {
47
+ const cacheKey = entrypoint.queryText + JSON.stringify(stableCopy(variables));
48
+ const factory = () => {
49
+ const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.makeNetworkRequest)(environment, entrypoint, variables);
50
+ const itemCleanupPair = [
51
+ {
52
+ kind: 'FragmentReference',
53
+ readerArtifact: entrypoint.readerArtifact,
54
+ root: IsographEnvironment_1.ROOT_ID,
55
+ variables,
56
+ nestedRefetchQueries: entrypoint.nestedRefetchQueries,
57
+ networkRequest: networkRequest,
58
+ },
59
+ disposeNetworkRequest,
60
+ ];
61
+ return itemCleanupPair;
62
+ };
63
+ return getOrCreateItemInSuspenseCache(environment, cacheKey, factory);
50
64
  }
51
65
  exports.getOrCreateCacheForArtifact = getOrCreateCacheForArtifact;
52
66
  function normalizeData(environment, normalizationAst, networkResponse, variables, nestedRefetchQueries) {
@@ -1,4 +1,4 @@
1
1
  import { FragmentReference } from '../core/FragmentReference';
2
2
  import { LoadableField } from '../core/reader';
3
- export declare function useClientSideDefer<TResult>(loadableField: LoadableField<void, TResult>): FragmentReference<any, TResult>;
4
- export declare function useClientSideDefer<TArgs, TResult>(loadableField: LoadableField<TArgs, TResult>, args: TArgs): FragmentReference<any, TResult>;
3
+ export declare function useClientSideDefer<TResult>(loadableField: LoadableField<void, TResult>): FragmentReference<Record<string, never>, TResult>;
4
+ export declare function useClientSideDefer<TArgs extends Object, TResult>(loadableField: LoadableField<TArgs, TResult>, args: TArgs): FragmentReference<TArgs, TResult>;
@@ -8,7 +8,7 @@ function useClientSideDefer(loadableField, args) {
8
8
  // @ts-expect-error args is missing iff it has the type void
9
9
  const [id, loader] = loadableField(args);
10
10
  const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
11
- const cache = (0, cache_1.getOrCreateCache)(environment, id, loader);
11
+ const cache = (0, cache_1.getOrCreateItemInSuspenseCache)(environment, id, loader);
12
12
  const fragmentReference = (0, react_disposable_state_1.useLazyDisposableState)(cache).state;
13
13
  return fragmentReference;
14
14
  }
@@ -2,22 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useLazyReference = void 0;
4
4
  const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
5
- const IsographEnvironment_1 = require("../core/IsographEnvironment");
6
5
  const cache_1 = require("../core/cache");
7
6
  const react_disposable_state_1 = require("@isograph/react-disposable-state");
8
7
  function useLazyReference(entrypoint, variables) {
9
8
  const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
10
9
  const cache = (0, cache_1.getOrCreateCacheForArtifact)(environment, entrypoint, variables);
11
- const networkRequest = (0, react_disposable_state_1.useLazyDisposableState)(cache).state;
12
10
  return {
13
- fragmentReference: {
14
- kind: 'FragmentReference',
15
- readerArtifact: entrypoint.readerArtifact,
16
- root: IsographEnvironment_1.ROOT_ID,
17
- variables,
18
- nestedRefetchQueries: entrypoint.nestedRefetchQueries,
19
- networkRequest,
20
- },
11
+ fragmentReference: (0, react_disposable_state_1.useLazyDisposableState)(cache).state,
21
12
  };
22
13
  }
23
14
  exports.useLazyReference = useLazyReference;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isograph/react",
3
- "version": "0.0.0-main-edade9ce",
3
+ "version": "0.0.0-main-d6741831",
4
4
  "description": "Use Isograph with React",
5
5
  "homepage": "https://isograph.dev",
6
6
  "main": "dist/index.js",
@@ -17,9 +17,9 @@
17
17
  "tsc": "tsc"
18
18
  },
19
19
  "dependencies": {
20
- "@isograph/disposable-types": "0.0.0-main-edade9ce",
21
- "@isograph/react-disposable-state": "0.0.0-main-edade9ce",
22
- "@isograph/reference-counted-pointer": "0.0.0-main-edade9ce",
20
+ "@isograph/disposable-types": "0.0.0-main-d6741831",
21
+ "@isograph/react-disposable-state": "0.0.0-main-d6741831",
22
+ "@isograph/reference-counted-pointer": "0.0.0-main-d6741831",
23
23
  "react": "^18.2.0"
24
24
  },
25
25
  "devDependencies": {
@@ -27,7 +27,7 @@ type AnyRecordSubscription = {
27
27
 
28
28
  type Subscription = FragmentSubscription<Object> | AnyRecordSubscription;
29
29
  type Subscriptions = Set<Subscription>;
30
- type SuspenseCache = { [index: string]: ParentCache<any> };
30
+ type CacheMap<T> = { [index: string]: ParentCache<T> };
31
31
 
32
32
  export type IsographEnvironment = {
33
33
  readonly store: IsographStore;
@@ -35,7 +35,9 @@ export type IsographEnvironment = {
35
35
  readonly missingFieldHandler: MissingFieldHandler | null;
36
36
  readonly componentCache: ComponentCache;
37
37
  readonly subscriptions: Subscriptions;
38
- readonly suspenseCache: SuspenseCache;
38
+ // N.B. this must be <any, any>, but all *usages* of this should go through
39
+ // a function that adds type parameters.
40
+ readonly fragmentCache: CacheMap<FragmentReference<any, any>>;
39
41
  readonly retainedQueries: Set<RetainedQuery>;
40
42
  readonly gcBuffer: Array<RetainedQuery>;
41
43
  readonly gcBufferSize: number;
@@ -100,7 +102,7 @@ export function createIsographEnvironment(
100
102
  missingFieldHandler: missingFieldHandler ?? null,
101
103
  componentCache: {},
102
104
  subscriptions: new Set(),
103
- suspenseCache: {},
105
+ fragmentCache: {},
104
106
  retainedQueries: new Set(),
105
107
  gcBuffer: [],
106
108
  gcBufferSize: DEFAULT_GC_BUFFER_SIZE,
package/src/core/cache.ts CHANGED
@@ -1,5 +1,8 @@
1
- import { Factory, ParentCache } from '@isograph/react-disposable-state';
2
- import { AnyError, PromiseWrapper } from './PromiseWrapper';
1
+ import {
2
+ Factory,
3
+ ItemCleanupPair,
4
+ ParentCache,
5
+ } from '@isograph/react-disposable-state';
3
6
  import {
4
7
  DataId,
5
8
  ROOT_ID,
@@ -33,23 +36,26 @@ declare global {
33
36
  }
34
37
  }
35
38
 
36
- export function getOrCreateCache<T>(
39
+ export function getOrCreateItemInSuspenseCache<
40
+ TReadFromStore extends Object,
41
+ TClientFieldValue,
42
+ >(
37
43
  environment: IsographEnvironment,
38
44
  index: string,
39
- factory: Factory<T>,
40
- ): ParentCache<T> {
45
+ factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>,
46
+ ): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>> {
41
47
  if (typeof window !== 'undefined' && window.__LOG) {
42
48
  console.log('getting cache for', {
43
49
  index,
44
- cache: Object.keys(environment.suspenseCache),
45
- found: !!environment.suspenseCache[index],
50
+ cache: Object.keys(environment.fragmentCache),
51
+ found: !!environment.fragmentCache[index],
46
52
  });
47
53
  }
48
- if (environment.suspenseCache[index] == null) {
49
- environment.suspenseCache[index] = new ParentCache(factory);
54
+ if (environment.fragmentCache[index] == null) {
55
+ environment.fragmentCache[index] = new ParentCache(factory);
50
56
  }
51
57
 
52
- return environment.suspenseCache[index];
58
+ return environment.fragmentCache[index];
53
59
  }
54
60
 
55
61
  /**
@@ -79,12 +85,32 @@ export function getOrCreateCacheForArtifact<
79
85
  TClientFieldValue,
80
86
  >(
81
87
  environment: IsographEnvironment,
82
- artifact: IsographEntrypoint<TReadFromStore, TClientFieldValue>,
88
+ entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue>,
83
89
  variables: Variables,
84
- ): ParentCache<PromiseWrapper<void, AnyError>> {
85
- const cacheKey = artifact.queryText + JSON.stringify(stableCopy(variables));
86
- const factory = () => makeNetworkRequest(environment, artifact, variables);
87
- return getOrCreateCache(environment, cacheKey, factory);
90
+ ): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>> {
91
+ const cacheKey = entrypoint.queryText + JSON.stringify(stableCopy(variables));
92
+ const factory = () => {
93
+ const [networkRequest, disposeNetworkRequest] = makeNetworkRequest(
94
+ environment,
95
+ entrypoint,
96
+ variables,
97
+ );
98
+ const itemCleanupPair: ItemCleanupPair<
99
+ FragmentReference<TReadFromStore, TClientFieldValue>
100
+ > = [
101
+ {
102
+ kind: 'FragmentReference',
103
+ readerArtifact: entrypoint.readerArtifact,
104
+ root: ROOT_ID,
105
+ variables,
106
+ nestedRefetchQueries: entrypoint.nestedRefetchQueries,
107
+ networkRequest: networkRequest,
108
+ },
109
+ disposeNetworkRequest,
110
+ ];
111
+ return itemCleanupPair;
112
+ };
113
+ return getOrCreateItemInSuspenseCache(environment, cacheKey, factory);
88
114
  }
89
115
 
90
116
  type NetworkResponseScalarValue = string | number | boolean;
@@ -1,27 +1,26 @@
1
1
  import { FragmentReference } from '../core/FragmentReference';
2
2
  import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
3
- import { getOrCreateCache } from '../core/cache';
3
+ import { getOrCreateItemInSuspenseCache } from '../core/cache';
4
4
  import { useLazyDisposableState } from '@isograph/react-disposable-state';
5
5
  import { LoadableField } from '../core/reader';
6
6
 
7
7
  export function useClientSideDefer<TResult>(
8
8
  loadableField: LoadableField<void, TResult>,
9
- ): FragmentReference<any, TResult>;
9
+ ): FragmentReference<Record<string, never>, TResult>;
10
10
 
11
- export function useClientSideDefer<TArgs, TResult>(
11
+ export function useClientSideDefer<TArgs extends Object, TResult>(
12
12
  loadableField: LoadableField<TArgs, TResult>,
13
13
  args: TArgs,
14
- ): FragmentReference<any, TResult>;
14
+ ): FragmentReference<TArgs, TResult>;
15
15
 
16
- export function useClientSideDefer<TArgs, TResult>(
16
+ export function useClientSideDefer<TArgs extends Object, TResult>(
17
17
  loadableField: LoadableField<TArgs, TResult>,
18
18
  args?: TArgs,
19
- // TODO this should return { fragmentReference, networkRequestReference }
20
- ): FragmentReference<any, TResult> {
19
+ ): FragmentReference<TArgs, TResult> {
21
20
  // @ts-expect-error args is missing iff it has the type void
22
21
  const [id, loader] = loadableField(args);
23
22
  const environment = useIsographEnvironment();
24
- const cache = getOrCreateCache(environment, id, loader);
23
+ const cache = getOrCreateItemInSuspenseCache(environment, id, loader);
25
24
 
26
25
  const fragmentReference = useLazyDisposableState(cache).state;
27
26
 
@@ -1,6 +1,5 @@
1
1
  import { FragmentReference, Variables } from '../core/FragmentReference';
2
2
  import { useIsographEnvironment } from './IsographEnvironmentProvider';
3
- import { ROOT_ID } from '../core/IsographEnvironment';
4
3
  import { IsographEntrypoint } from '../core/entrypoint';
5
4
  import { getOrCreateCacheForArtifact } from '../core/cache';
6
5
  import { useLazyDisposableState } from '@isograph/react-disposable-state';
@@ -17,16 +16,7 @@ export function useLazyReference<
17
16
  const environment = useIsographEnvironment();
18
17
  const cache = getOrCreateCacheForArtifact(environment, entrypoint, variables);
19
18
 
20
- const networkRequest = useLazyDisposableState(cache).state;
21
-
22
19
  return {
23
- fragmentReference: {
24
- kind: 'FragmentReference',
25
- readerArtifact: entrypoint.readerArtifact,
26
- root: ROOT_ID,
27
- variables,
28
- nestedRefetchQueries: entrypoint.nestedRefetchQueries,
29
- networkRequest,
30
- },
20
+ fragmentReference: useLazyDisposableState(cache).state,
31
21
  };
32
22
  }