@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.
- package/dist/core/IsographEnvironment.d.ts +3 -3
- package/dist/core/IsographEnvironment.js +1 -1
- package/dist/core/cache.d.ts +2 -3
- package/dist/core/cache.js +26 -12
- package/dist/loadable-hooks/useClientSideDefer.d.ts +2 -2
- package/dist/loadable-hooks/useClientSideDefer.js +1 -1
- package/dist/react/useLazyReference.js +1 -10
- package/package.json +4 -4
- package/src/core/IsographEnvironment.ts +5 -3
- package/src/core/cache.ts +41 -15
- package/src/loadable-hooks/useClientSideDefer.ts +7 -8
- package/src/react/useLazyReference.ts +1 -11
@@ -25,8 +25,8 @@ type AnyRecordSubscription = {
|
|
25
25
|
};
|
26
26
|
type Subscription = FragmentSubscription<Object> | AnyRecordSubscription;
|
27
27
|
type Subscriptions = Set<Subscription>;
|
28
|
-
type
|
29
|
-
[index: string]: ParentCache<
|
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
|
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
|
-
|
13
|
+
fragmentCache: {},
|
14
14
|
retainedQueries: new Set(),
|
15
15
|
gcBuffer: [],
|
16
16
|
gcBufferSize: DEFAULT_GC_BUFFER_SIZE,
|
package/dist/core/cache.d.ts
CHANGED
@@ -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
|
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,
|
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 = {
|
package/dist/core/cache.js
CHANGED
@@ -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.
|
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
|
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.
|
15
|
-
found: !!environment.
|
14
|
+
cache: Object.keys(environment.fragmentCache),
|
15
|
+
found: !!environment.fragmentCache[index],
|
16
16
|
});
|
17
17
|
}
|
18
|
-
if (environment.
|
19
|
-
environment.
|
18
|
+
if (environment.fragmentCache[index] == null) {
|
19
|
+
environment.fragmentCache[index] = new react_disposable_state_1.ParentCache(factory);
|
20
20
|
}
|
21
|
-
return environment.
|
21
|
+
return environment.fragmentCache[index];
|
22
22
|
}
|
23
|
-
exports.
|
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,
|
47
|
-
const cacheKey =
|
48
|
-
const factory = () =>
|
49
|
-
|
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<
|
4
|
-
export declare function useClientSideDefer<TArgs, TResult>(loadableField: LoadableField<TArgs, TResult>, args: TArgs): FragmentReference<
|
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.
|
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-
|
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-
|
21
|
-
"@isograph/react-disposable-state": "0.0.0-main-
|
22
|
-
"@isograph/reference-counted-pointer": "0.0.0-main-
|
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
|
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
|
-
|
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
|
-
|
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 {
|
2
|
-
|
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
|
39
|
+
export function getOrCreateItemInSuspenseCache<
|
40
|
+
TReadFromStore extends Object,
|
41
|
+
TClientFieldValue,
|
42
|
+
>(
|
37
43
|
environment: IsographEnvironment,
|
38
44
|
index: string,
|
39
|
-
factory: Factory<
|
40
|
-
): ParentCache<
|
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.
|
45
|
-
found: !!environment.
|
50
|
+
cache: Object.keys(environment.fragmentCache),
|
51
|
+
found: !!environment.fragmentCache[index],
|
46
52
|
});
|
47
53
|
}
|
48
|
-
if (environment.
|
49
|
-
environment.
|
54
|
+
if (environment.fragmentCache[index] == null) {
|
55
|
+
environment.fragmentCache[index] = new ParentCache(factory);
|
50
56
|
}
|
51
57
|
|
52
|
-
return environment.
|
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
|
-
|
88
|
+
entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue>,
|
83
89
|
variables: Variables,
|
84
|
-
): ParentCache<
|
85
|
-
const cacheKey =
|
86
|
-
const factory = () =>
|
87
|
-
|
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 {
|
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<
|
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<
|
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
|
-
|
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 =
|
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
|
}
|