@isograph/react 0.0.0-main-6c4d9bd8 → 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 +30 -13
- package/dist/core/read.d.ts +3 -2
- package/dist/core/read.js +9 -1
- package/dist/loadable-hooks/useClientSideDefer.d.ts +2 -2
- package/dist/loadable-hooks/useClientSideDefer.js +1 -1
- package/dist/react/FragmentReader.d.ts +2 -2
- package/dist/react/FragmentReader.js +1 -2
- package/dist/react/useLazyReference.js +1 -10
- package/dist/react/useResult.d.ts +1 -1
- package/dist/react/useResult.js +3 -1
- package/package.json +4 -4
- package/src/core/IsographEnvironment.ts +5 -3
- package/src/core/cache.ts +45 -16
- package/src/core/read.ts +11 -2
- package/src/loadable-hooks/useClientSideDefer.ts +7 -8
- package/src/react/FragmentReader.tsx +3 -3
- package/src/react/useLazyReference.ts +1 -11
- package/src/react/useResult.ts +8 -2
@@ -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) {
|
@@ -132,7 +146,10 @@ function callSubscriptions(environment, recordsEncounteredWhenNormalizing) {
|
|
132
146
|
// - consistency
|
133
147
|
// - it's also weird, this is called from makeNetworkRequest, where
|
134
148
|
// we don't currently pass network request options
|
135
|
-
{
|
149
|
+
{
|
150
|
+
suspendIfInFlight: false,
|
151
|
+
throwOnNetworkError: false,
|
152
|
+
});
|
136
153
|
if (!(0, areEqualWithDeepComparison_1.areEqualObjectsWithDeepComparison)(subscription.encounteredDataAndRecords.item, newEncounteredDataAndRecords.item)) {
|
137
154
|
if (typeof window !== 'undefined' && window.__LOG) {
|
138
155
|
console.log('Deep equality - No', {
|
package/dist/core/read.d.ts
CHANGED
@@ -6,6 +6,7 @@ export type WithEncounteredRecords<T> = {
|
|
6
6
|
};
|
7
7
|
export declare function readButDoNotEvaluate<TReadFromStore extends Object>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, unknown>, networkRequestOptions: NetworkRequestReaderOptions): WithEncounteredRecords<TReadFromStore>;
|
8
8
|
export type NetworkRequestReaderOptions = {
|
9
|
-
suspendIfInFlight
|
10
|
-
throwOnNetworkError
|
9
|
+
suspendIfInFlight: boolean;
|
10
|
+
throwOnNetworkError: boolean;
|
11
11
|
};
|
12
|
+
export declare function getNetworkRequestOptionsWithDefaults(networkRequestOptions?: Partial<NetworkRequestReaderOptions> | void): NetworkRequestReaderOptions;
|
package/dist/core/read.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.readButDoNotEvaluate = void 0;
|
3
|
+
exports.getNetworkRequestOptionsWithDefaults = exports.readButDoNotEvaluate = void 0;
|
4
4
|
const cache_1 = require("./cache");
|
5
5
|
const componentCache_1 = require("./componentCache");
|
6
6
|
const IsographEnvironment_1 = require("./IsographEnvironment");
|
@@ -329,6 +329,14 @@ function writeQueryArgsToVariables(targetVariables, queryArgs, variables) {
|
|
329
329
|
}
|
330
330
|
}
|
331
331
|
}
|
332
|
+
function getNetworkRequestOptionsWithDefaults(networkRequestOptions) {
|
333
|
+
var _a, _b;
|
334
|
+
return {
|
335
|
+
suspendIfInFlight: (_a = networkRequestOptions === null || networkRequestOptions === void 0 ? void 0 : networkRequestOptions.suspendIfInFlight) !== null && _a !== void 0 ? _a : false,
|
336
|
+
throwOnNetworkError: (_b = networkRequestOptions === null || networkRequestOptions === void 0 ? void 0 : networkRequestOptions.throwOnNetworkError) !== null && _b !== void 0 ? _b : true,
|
337
|
+
};
|
338
|
+
}
|
339
|
+
exports.getNetworkRequestOptionsWithDefaults = getNetworkRequestOptionsWithDefaults;
|
332
340
|
// TODO use a description of the params for this?
|
333
341
|
// TODO call stableStringifyArgs on the variable values, as well.
|
334
342
|
// This doesn't matter for now, since we are just using primitive values
|
@@ -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
|
}
|
@@ -5,9 +5,9 @@ import { NetworkRequestReaderOptions } from '../core/read';
|
|
5
5
|
export declare function FragmentReader<TProps extends Record<any, any>, TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>>(props: TProps extends Record<string, never> ? {
|
6
6
|
fragmentReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<{}>>;
|
7
7
|
additionalProps?: TProps;
|
8
|
-
networkRequestOptions?: NetworkRequestReaderOptions
|
8
|
+
networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
|
9
9
|
} : {
|
10
10
|
fragmentReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<TProps>>;
|
11
11
|
additionalProps: TProps;
|
12
|
-
networkRequestOptions?: NetworkRequestReaderOptions
|
12
|
+
networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
|
13
13
|
}): React.ReactNode;
|
@@ -27,8 +27,7 @@ exports.FragmentReader = void 0;
|
|
27
27
|
const React = __importStar(require("react"));
|
28
28
|
const useResult_1 = require("./useResult");
|
29
29
|
function FragmentReader(props) {
|
30
|
-
|
31
|
-
const Component = (0, useResult_1.useResult)(props.fragmentReference, (_a = props.networkRequestOptions) !== null && _a !== void 0 ? _a : {});
|
30
|
+
const Component = (0, useResult_1.useResult)(props.fragmentReference, props.networkRequestOptions);
|
32
31
|
return React.createElement(Component, Object.assign({}, props.additionalProps));
|
33
32
|
}
|
34
33
|
exports.FragmentReader = FragmentReader;
|
@@ -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;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { FragmentReference } from '../core/FragmentReference';
|
2
2
|
import { NetworkRequestReaderOptions } from '../core/read';
|
3
3
|
import { PromiseWrapper } from '../core/PromiseWrapper';
|
4
|
-
export declare function useResult<TReadFromStore extends Object, TClientFieldValue>(fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>,
|
4
|
+
export declare function useResult<TReadFromStore extends Object, TClientFieldValue>(fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>, partialNetworkRequestOptions?: Partial<NetworkRequestReaderOptions> | void): TClientFieldValue;
|
5
5
|
export declare function maybeUnwrapNetworkRequest(networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions): void;
|
package/dist/react/useResult.js
CHANGED
@@ -4,9 +4,11 @@ exports.maybeUnwrapNetworkRequest = exports.useResult = void 0;
|
|
4
4
|
const IsographEnvironmentProvider_1 = require("../react/IsographEnvironmentProvider");
|
5
5
|
const componentCache_1 = require("../core/componentCache");
|
6
6
|
const useReadAndSubscribe_1 = require("./useReadAndSubscribe");
|
7
|
+
const read_1 = require("../core/read");
|
7
8
|
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
8
|
-
function useResult(fragmentReference,
|
9
|
+
function useResult(fragmentReference, partialNetworkRequestOptions) {
|
9
10
|
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
11
|
+
const networkRequestOptions = (0, read_1.getNetworkRequestOptionsWithDefaults)(partialNetworkRequestOptions);
|
10
12
|
maybeUnwrapNetworkRequest(fragmentReference.networkRequest, networkRequestOptions);
|
11
13
|
switch (fragmentReference.readerArtifact.kind) {
|
12
14
|
case 'ComponentReaderArtifact': {
|
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;
|
@@ -226,7 +252,10 @@ function callSubscriptions(
|
|
226
252
|
// - consistency
|
227
253
|
// - it's also weird, this is called from makeNetworkRequest, where
|
228
254
|
// we don't currently pass network request options
|
229
|
-
{
|
255
|
+
{
|
256
|
+
suspendIfInFlight: false,
|
257
|
+
throwOnNetworkError: false,
|
258
|
+
},
|
230
259
|
);
|
231
260
|
|
232
261
|
if (
|
package/src/core/read.ts
CHANGED
@@ -468,10 +468,19 @@ function writeQueryArgsToVariables(
|
|
468
468
|
}
|
469
469
|
|
470
470
|
export type NetworkRequestReaderOptions = {
|
471
|
-
suspendIfInFlight
|
472
|
-
throwOnNetworkError
|
471
|
+
suspendIfInFlight: boolean;
|
472
|
+
throwOnNetworkError: boolean;
|
473
473
|
};
|
474
474
|
|
475
|
+
export function getNetworkRequestOptionsWithDefaults(
|
476
|
+
networkRequestOptions?: Partial<NetworkRequestReaderOptions> | void,
|
477
|
+
): NetworkRequestReaderOptions {
|
478
|
+
return {
|
479
|
+
suspendIfInFlight: networkRequestOptions?.suspendIfInFlight ?? false,
|
480
|
+
throwOnNetworkError: networkRequestOptions?.throwOnNetworkError ?? true,
|
481
|
+
};
|
482
|
+
}
|
483
|
+
|
475
484
|
// TODO use a description of the params for this?
|
476
485
|
// TODO call stableStringifyArgs on the variable values, as well.
|
477
486
|
// This doesn't matter for now, since we are just using primitive values
|
@@ -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
|
|
@@ -15,7 +15,7 @@ export function FragmentReader<
|
|
15
15
|
React.FC<{}>
|
16
16
|
>;
|
17
17
|
additionalProps?: TProps;
|
18
|
-
networkRequestOptions?: NetworkRequestReaderOptions
|
18
|
+
networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
|
19
19
|
}
|
20
20
|
: {
|
21
21
|
fragmentReference: FragmentReference<
|
@@ -23,12 +23,12 @@ export function FragmentReader<
|
|
23
23
|
React.FC<TProps>
|
24
24
|
>;
|
25
25
|
additionalProps: TProps;
|
26
|
-
networkRequestOptions?: NetworkRequestReaderOptions
|
26
|
+
networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
|
27
27
|
},
|
28
28
|
): React.ReactNode {
|
29
29
|
const Component = useResult(
|
30
30
|
props.fragmentReference,
|
31
|
-
props.networkRequestOptions
|
31
|
+
props.networkRequestOptions,
|
32
32
|
);
|
33
33
|
return <Component {...props.additionalProps} />;
|
34
34
|
}
|
@@ -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
|
}
|
package/src/react/useResult.ts
CHANGED
@@ -2,14 +2,20 @@ import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
|
|
2
2
|
import { FragmentReference } from '../core/FragmentReference';
|
3
3
|
import { getOrCreateCachedComponent } from '../core/componentCache';
|
4
4
|
import { useReadAndSubscribe } from './useReadAndSubscribe';
|
5
|
-
import {
|
5
|
+
import {
|
6
|
+
getNetworkRequestOptionsWithDefaults,
|
7
|
+
NetworkRequestReaderOptions,
|
8
|
+
} from '../core/read';
|
6
9
|
import { getPromiseState, PromiseWrapper } from '../core/PromiseWrapper';
|
7
10
|
|
8
11
|
export function useResult<TReadFromStore extends Object, TClientFieldValue>(
|
9
12
|
fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>,
|
10
|
-
|
13
|
+
partialNetworkRequestOptions?: Partial<NetworkRequestReaderOptions> | void,
|
11
14
|
): TClientFieldValue {
|
12
15
|
const environment = useIsographEnvironment();
|
16
|
+
const networkRequestOptions = getNetworkRequestOptionsWithDefaults(
|
17
|
+
partialNetworkRequestOptions,
|
18
|
+
);
|
13
19
|
|
14
20
|
maybeUnwrapNetworkRequest(
|
15
21
|
fragmentReference.networkRequest,
|