@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.
@@ -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) {
@@ -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', {
@@ -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?: boolean;
10
- throwOnNetworkError?: boolean;
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<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
  }
@@ -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
- var _a;
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>, networkRequestOptions: NetworkRequestReaderOptions): 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;
@@ -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, networkRequestOptions) {
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-6c4d9bd8",
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-6c4d9bd8",
21
- "@isograph/react-disposable-state": "0.0.0-main-6c4d9bd8",
22
- "@isograph/reference-counted-pointer": "0.0.0-main-6c4d9bd8",
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;
@@ -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?: boolean;
472
- throwOnNetworkError?: boolean;
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 { 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
 
@@ -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
  }
@@ -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 { NetworkRequestReaderOptions } from '../core/read';
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
- networkRequestOptions: NetworkRequestReaderOptions,
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,