@isograph/react 0.0.0-main-6bd3135f → 0.0.0-main-eca51643

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.
@@ -6,7 +6,7 @@ import { Arguments } from './util';
6
6
  export type TopLevelReaderArtifact<TReadFromStore extends {
7
7
  parameters: object;
8
8
  data: object;
9
- }, TClientFieldValue, TComponentProps extends Record<string, never>> = EagerReaderArtifact<TReadFromStore, TClientFieldValue> | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
9
+ }, TClientFieldValue, TComponentProps extends Record<PropertyKey, never>> = EagerReaderArtifact<TReadFromStore, TClientFieldValue> | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
10
10
  export type EagerReaderArtifact<TReadFromStore extends {
11
11
  parameters: object;
12
12
  data: object;
@@ -18,7 +18,7 @@ export type EagerReaderArtifact<TReadFromStore extends {
18
18
  export type ComponentReaderArtifact<TReadFromStore extends {
19
19
  parameters: object;
20
20
  data: object;
21
- }, TComponentProps extends Record<string, unknown> = Record<string, never>> = {
21
+ }, TComponentProps extends Record<string, unknown> = Record<PropertyKey, never>> = {
22
22
  readonly kind: 'ComponentReaderArtifact';
23
23
  readonly componentName: ComponentOrFieldName;
24
24
  readonly readerAst: ReaderAst<TReadFromStore>;
@@ -77,5 +77,5 @@ type StableId = string;
77
77
  export type LoadableField<TReadFromStore extends {
78
78
  data: object;
79
79
  parameters: object;
80
- }, TResult, TProvidedArgs extends object = object> = (args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs> | void) => [StableId, Factory<FragmentReference<TReadFromStore, TResult>>];
80
+ }, TResult, TArgs = ExtractParameters<TReadFromStore>> = (args: TArgs | void) => [StableId, Factory<FragmentReference<TReadFromStore, TResult>>];
81
81
  export {};
@@ -1,4 +1,5 @@
1
1
  export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> = T extends (arg1: any, arg2: infer P) => any ? P : never;
2
+ export type CombineWithIntrinsicAttributes<T> = T extends Record<PropertyKey, never> ? JSX.IntrinsicAttributes : T & JSX.IntrinsicAttributes;
2
3
  export type Arguments = Argument[];
3
4
  export type Argument = [ArgumentName, ArgumentValue];
4
5
  export type ArgumentName = string;
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export { ROOT_ID, type DataId, type DataTypeValue, type IsographEnvironment, typ
6
6
  export { type EagerReaderArtifact, type ComponentReaderArtifact, type RefetchReaderArtifact, type ReaderAst, type ReaderAstNode, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField, type TopLevelReaderArtifact, type LoadableField, type ResolverFirstParameter, } from './core/reader';
7
7
  export { type NormalizationAst, type NormalizationAstNode, type NormalizationLinkedField, type NormalizationScalarField, type IsographEntrypoint, assertIsEntrypoint, type RefetchQueryNormalizationArtifact, type RefetchQueryNormalizationArtifactWrapper, type ExtractProps, type ExtractReadFromStore, type ExtractResolverResult, } from './core/entrypoint';
8
8
  export { readButDoNotEvaluate } from './core/read';
9
- export { type ExtractSecondParam, type Argument, type ArgumentName, type ArgumentValue, type Arguments, } from './core/util';
9
+ export { type ExtractSecondParam, type CombineWithIntrinsicAttributes, type Argument, type ArgumentName, type ArgumentValue, type Arguments, } from './core/util';
10
10
  export { type FragmentReference, type Variables, type ExtractParameters, type ExtractData, stableIdForFragmentReference, } from './core/FragmentReference';
11
11
  export { type LogMessage, type LogFunction, logMessage, registerLogger, } from './core/logging';
12
12
  export { IsographEnvironmentProvider, useIsographEnvironment, type IsographEnvironmentProviderProps, } from './react/IsographEnvironmentProvider';
@@ -3,12 +3,12 @@ import { LoadableField } from '../core/reader';
3
3
  export declare function useClientSideDefer<TReadFromStore extends {
4
4
  data: object;
5
5
  parameters: object;
6
- }, TResult>(loadableField: LoadableField<TReadFromStore, TResult>): {
6
+ }, TResult>(loadableField: LoadableField<TReadFromStore, TResult, ExtractParameters<TReadFromStore>>): {
7
7
  fragmentReference: FragmentReference<TReadFromStore, TResult>;
8
8
  };
9
9
  export declare function useClientSideDefer<TReadFromStore extends {
10
10
  data: object;
11
11
  parameters: object;
12
- }, TResult, TProvidedArgs extends object>(loadableField: LoadableField<TReadFromStore, TResult, TProvidedArgs>, args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>): {
12
+ }, TResult, TProvidedArgs extends object>(loadableField: LoadableField<TReadFromStore, TResult, Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>>, args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>): {
13
13
  fragmentReference: FragmentReference<TReadFromStore, TResult>;
14
14
  };
@@ -1,7 +1,5 @@
1
1
  import { FragmentReference } from '../core/FragmentReference';
2
2
  import { LoadableField } from '../core/reader';
3
- type FirstOrAfter = 'first' | 'after';
4
- type OmitFirstAfter<TArgs> = keyof Omit<TArgs, FirstOrAfter> extends never ? void | Record<string, never> : Omit<TArgs, FirstOrAfter>;
5
3
  type UsePaginationReturnValue<TReadFromStore extends {
6
4
  parameters: object;
7
5
  data: object;
@@ -11,7 +9,7 @@ type UsePaginationReturnValue<TReadFromStore extends {
11
9
  results: ReadonlyArray<TItem>;
12
10
  } | {
13
11
  kind: 'Complete';
14
- fetchMore: (args: OmitFirstAfter<TReadFromStore['parameters']>, first: number) => void;
12
+ fetchMore: (count: number) => void;
15
13
  results: ReadonlyArray<TItem>;
16
14
  hasNextPage: boolean;
17
15
  };
@@ -23,11 +21,12 @@ type Connection<T> = {
23
21
  readonly edges: ReadonlyArray<T> | null;
24
22
  readonly pageInfo: PageInfo;
25
23
  };
24
+ type UseConnectionSpecPaginationArgs = {
25
+ first: number;
26
+ after: string | null;
27
+ };
26
28
  export declare function useConnectionSpecPagination<TReadFromStore extends {
27
- parameters: {
28
- readonly first?: number | void | null;
29
- readonly after?: string | void | null;
30
- };
29
+ parameters: object;
31
30
  data: object;
32
- }, TItem>(loadableField: LoadableField<TReadFromStore, Connection<TItem>>): UsePaginationReturnValue<TReadFromStore, TItem>;
31
+ }, TItem>(loadableField: LoadableField<TReadFromStore, Connection<TItem>, UseConnectionSpecPaginationArgs>, pageInfo?: PageInfo): UsePaginationReturnValue<TReadFromStore, TItem>;
33
32
  export {};
@@ -19,7 +19,8 @@ function flatten(arr) {
19
19
  }
20
20
  return outArray;
21
21
  }
22
- function useConnectionSpecPagination(loadableField) {
22
+ function useConnectionSpecPagination(loadableField, pageInfo) {
23
+ var _a, _b;
23
24
  const networkRequestOptions = {
24
25
  suspendIfInFlight: true,
25
26
  throwOnNetworkError: true,
@@ -64,9 +65,11 @@ function useConnectionSpecPagination(loadableField) {
64
65
  };
65
66
  });
66
67
  }
67
- const getFetchMore = (after) => (args, first) => {
68
- // @ts-expect-error
69
- const loadedField = loadableField(Object.assign(Object.assign({}, args), { after: after, first: first }))[1]();
68
+ const getFetchMore = (after) => (count) => {
69
+ const loadedField = loadableField({
70
+ after: after,
71
+ first: count,
72
+ })[1]();
70
73
  const newPointer = (0, reference_counted_pointer_1.createReferenceCountedPointer)(loadedField);
71
74
  const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
72
75
  const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
@@ -113,9 +116,9 @@ function useConnectionSpecPagination(loadableField) {
113
116
  if (!networkRequestStatus) {
114
117
  return {
115
118
  kind: 'Complete',
116
- fetchMore: getFetchMore(null),
119
+ fetchMore: getFetchMore((_a = pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.endCursor) !== null && _a !== void 0 ? _a : null),
117
120
  results: [],
118
- hasNextPage: true,
121
+ hasNextPage: (_b = pageInfo === null || pageInfo === void 0 ? void 0 : pageInfo.hasNextPage) !== null && _b !== void 0 ? _b : true,
119
122
  };
120
123
  }
121
124
  switch (networkRequestStatus.kind) {
@@ -11,5 +11,5 @@ type UseImperativeLoadableFieldReturn<TReadFromStore extends {
11
11
  export declare function useImperativeLoadableField<TReadFromStore extends {
12
12
  data: object;
13
13
  parameters: object;
14
- }, TResult, TProvidedArgs extends object>(loadableField: LoadableField<TReadFromStore, TResult, TProvidedArgs>): UseImperativeLoadableFieldReturn<TReadFromStore, TResult, TProvidedArgs>;
14
+ }, TResult, TProvidedArgs extends object>(loadableField: LoadableField<TReadFromStore, TResult, Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>>): UseImperativeLoadableFieldReturn<TReadFromStore, TResult, TProvidedArgs>;
15
15
  export {};
@@ -1,24 +1,25 @@
1
1
  import { LoadableField } from '../core/reader';
2
2
  import { FragmentReference } from '../core/FragmentReference';
3
- type SkipOrLimit = 'skip' | 'limit';
4
- type OmitSkipLimit<TArgs> = keyof Omit<TArgs, SkipOrLimit> extends never ? void | Record<string, never> : Omit<TArgs, SkipOrLimit>;
5
3
  type UseSkipLimitReturnValue<TReadFromStore extends {
6
4
  data: object;
7
5
  parameters: object;
8
- }, TArgs, TItem> = {
6
+ }, TItem> = {
9
7
  readonly kind: 'Complete';
10
- readonly fetchMore: (args: OmitSkipLimit<TArgs>, count: number) => void;
8
+ readonly fetchMore: (count: number) => void;
11
9
  readonly results: ReadonlyArray<TItem>;
12
10
  } | {
13
11
  readonly kind: 'Pending';
14
12
  readonly results: ReadonlyArray<TItem>;
15
13
  readonly pendingFragment: FragmentReference<TReadFromStore, ReadonlyArray<TItem>>;
16
14
  };
17
- export declare function useSkipLimitPagination<TArgs extends {
18
- skip: number | void | null;
19
- limit: number | void | null;
20
- }, TItem, TReadFromStore extends {
21
- parameters: TArgs;
15
+ type UseSkipLimitPaginationArgs = {
16
+ skip: number;
17
+ limit: number;
18
+ };
19
+ export declare function useSkipLimitPagination<TItem, TReadFromStore extends {
20
+ parameters: object;
22
21
  data: object;
23
- }>(loadableField: LoadableField<TReadFromStore, ReadonlyArray<TItem>>): UseSkipLimitReturnValue<TReadFromStore, TArgs, TItem>;
22
+ }>(loadableField: LoadableField<TReadFromStore, ReadonlyArray<TItem>, UseSkipLimitPaginationArgs>, initialArgs?: {
23
+ skip?: number | void | null;
24
+ }): UseSkipLimitReturnValue<TReadFromStore, TItem>;
24
25
  export {};
@@ -19,7 +19,8 @@ function flatten(arr) {
19
19
  }
20
20
  return outArray;
21
21
  }
22
- function useSkipLimitPagination(loadableField) {
22
+ function useSkipLimitPagination(loadableField, initialArgs) {
23
+ var _a;
23
24
  const networkRequestOptions = {
24
25
  suspendIfInFlight: true,
25
26
  throwOnNetworkError: true,
@@ -57,9 +58,11 @@ function useSkipLimitPagination(loadableField) {
57
58
  };
58
59
  });
59
60
  }
60
- const getFetchMore = (loadedSoFar) => (args, count) => {
61
- // @ts-expect-error
62
- const loadedField = loadableField(Object.assign(Object.assign({}, args), { skip: loadedSoFar, limit: count }))[1]();
61
+ const getFetchMore = (loadedSoFar) => (count) => {
62
+ const loadedField = loadableField({
63
+ skip: loadedSoFar,
64
+ limit: count,
65
+ })[1]();
63
66
  const newPointer = (0, reference_counted_pointer_1.createReferenceCountedPointer)(loadedField);
64
67
  const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
65
68
  const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
@@ -106,7 +109,7 @@ function useSkipLimitPagination(loadableField) {
106
109
  if (!networkRequestStatus) {
107
110
  return {
108
111
  kind: 'Complete',
109
- fetchMore: getFetchMore(0),
112
+ fetchMore: getFetchMore((_a = initialArgs === null || initialArgs === void 0 ? void 0 : initialArgs.skip) !== null && _a !== void 0 ? _a : 0),
110
113
  results: [],
111
114
  };
112
115
  }
@@ -135,3 +138,15 @@ function useSkipLimitPagination(loadableField) {
135
138
  }
136
139
  }
137
140
  }
141
+ // @ts-ignore
142
+ function tsTests() {
143
+ let basicLoadable;
144
+ useSkipLimitPagination(basicLoadable);
145
+ useSkipLimitPagination(basicLoadable, {});
146
+ useSkipLimitPagination(basicLoadable, { skip: 10 });
147
+ let unprovidedSearchLoadable;
148
+ // @ts-expect-error
149
+ useSkipLimitPagination(unprovidedSearchLoadable);
150
+ let providedSearchLoadable;
151
+ useSkipLimitPagination(providedSearchLoadable);
152
+ }
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { ExtractReadFromStore, IsographEntrypoint } from '../core/entrypoint';
3
3
  import { FragmentReference } from '../core/FragmentReference';
4
4
  import { NetworkRequestReaderOptions } from '../core/read';
5
- export declare function FragmentReader<TProps extends Record<any, any>, TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>>(props: TProps extends Record<string, never> ? {
5
+ export declare function FragmentReader<TProps extends Record<any, any>, TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>>(props: TProps extends Record<PropertyKey, never> ? {
6
6
  fragmentReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<{}>>;
7
7
  additionalProps?: TProps;
8
8
  networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isograph/react",
3
- "version": "0.0.0-main-6bd3135f",
3
+ "version": "0.0.0-main-eca51643",
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-6bd3135f",
21
- "@isograph/react-disposable-state": "0.0.0-main-6bd3135f",
22
- "@isograph/reference-counted-pointer": "0.0.0-main-6bd3135f"
20
+ "@isograph/disposable-types": "0.0.0-main-eca51643",
21
+ "@isograph/react-disposable-state": "0.0.0-main-eca51643",
22
+ "@isograph/reference-counted-pointer": "0.0.0-main-eca51643"
23
23
  },
24
24
  "peerDependencies": {
25
25
  "react": "18.3.1"
@@ -20,7 +20,7 @@ import { Arguments } from './util';
20
20
  export type TopLevelReaderArtifact<
21
21
  TReadFromStore extends { parameters: object; data: object },
22
22
  TClientFieldValue,
23
- TComponentProps extends Record<string, never>,
23
+ TComponentProps extends Record<PropertyKey, never>,
24
24
  > =
25
25
  | EagerReaderArtifact<TReadFromStore, TClientFieldValue>
26
26
  | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
@@ -38,7 +38,7 @@ export type EagerReaderArtifact<
38
38
 
39
39
  export type ComponentReaderArtifact<
40
40
  TReadFromStore extends { parameters: object; data: object },
41
- TComponentProps extends Record<string, unknown> = Record<string, never>,
41
+ TComponentProps extends Record<string, unknown> = Record<PropertyKey, never>,
42
42
  > = {
43
43
  readonly kind: 'ComponentReaderArtifact';
44
44
  readonly componentName: ComponentOrFieldName;
@@ -144,7 +144,7 @@ type StableId = string;
144
144
  export type LoadableField<
145
145
  TReadFromStore extends { data: object; parameters: object },
146
146
  TResult,
147
- TProvidedArgs extends object = object,
147
+ TArgs = ExtractParameters<TReadFromStore>,
148
148
  > = (
149
- args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs> | void,
149
+ args: TArgs | void,
150
150
  ) => [StableId, Factory<FragmentReference<TReadFromStore, TResult>>];
package/src/core/util.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> =
2
2
  T extends (arg1: any, arg2: infer P) => any ? P : never;
3
+ export type CombineWithIntrinsicAttributes<T> =
4
+ T extends Record<PropertyKey, never>
5
+ ? JSX.IntrinsicAttributes
6
+ : T & JSX.IntrinsicAttributes;
3
7
 
4
8
  export type Arguments = Argument[];
5
9
  export type Argument = [ArgumentName, ArgumentValue];
package/src/index.ts CHANGED
@@ -55,6 +55,7 @@ export {
55
55
  export { readButDoNotEvaluate } from './core/read';
56
56
  export {
57
57
  type ExtractSecondParam,
58
+ type CombineWithIntrinsicAttributes,
58
59
  type Argument,
59
60
  type ArgumentName,
60
61
  type ArgumentValue,
@@ -11,7 +11,11 @@ export function useClientSideDefer<
11
11
  TReadFromStore extends { data: object; parameters: object },
12
12
  TResult,
13
13
  >(
14
- loadableField: LoadableField<TReadFromStore, TResult>,
14
+ loadableField: LoadableField<
15
+ TReadFromStore,
16
+ TResult,
17
+ ExtractParameters<TReadFromStore>
18
+ >,
15
19
  ): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
16
20
 
17
21
  export function useClientSideDefer<
@@ -19,7 +23,11 @@ export function useClientSideDefer<
19
23
  TResult,
20
24
  TProvidedArgs extends object,
21
25
  >(
22
- loadableField: LoadableField<TReadFromStore, TResult, TProvidedArgs>,
26
+ loadableField: LoadableField<
27
+ TReadFromStore,
28
+ TResult,
29
+ Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
30
+ >,
23
31
  args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>,
24
32
  ): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
25
33
 
@@ -28,7 +36,11 @@ export function useClientSideDefer<
28
36
  TResult,
29
37
  TProvidedArgs extends object,
30
38
  >(
31
- loadableField: LoadableField<TReadFromStore, TResult, TProvidedArgs>,
39
+ loadableField: LoadableField<
40
+ TReadFromStore,
41
+ TResult,
42
+ Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
43
+ >,
32
44
  args?: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>,
33
45
  ): { fragmentReference: FragmentReference<TReadFromStore, TResult> } {
34
46
  const [id, loader] = loadableField(args);
@@ -20,11 +20,6 @@ import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
20
20
  import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
21
21
  import { maybeUnwrapNetworkRequest } from '../react/useResult';
22
22
 
23
- type FirstOrAfter = 'first' | 'after';
24
- type OmitFirstAfter<TArgs> = keyof Omit<TArgs, FirstOrAfter> extends never
25
- ? void | Record<string, never>
26
- : Omit<TArgs, FirstOrAfter>;
27
-
28
23
  type UsePaginationReturnValue<
29
24
  TReadFromStore extends { parameters: object; data: object },
30
25
  TItem,
@@ -36,10 +31,7 @@ type UsePaginationReturnValue<
36
31
  }
37
32
  | {
38
33
  kind: 'Complete';
39
- fetchMore: (
40
- args: OmitFirstAfter<TReadFromStore['parameters']>,
41
- first: number,
42
- ) => void;
34
+ fetchMore: (count: number) => void;
43
35
  results: ReadonlyArray<TItem>;
44
36
  hasNextPage: boolean;
45
37
  };
@@ -81,17 +73,24 @@ type NonNullConnection<T> = {
81
73
  readonly pageInfo: PageInfo;
82
74
  };
83
75
 
76
+ type UseConnectionSpecPaginationArgs = {
77
+ first: number;
78
+ after: string | null;
79
+ };
80
+
84
81
  export function useConnectionSpecPagination<
85
82
  TReadFromStore extends {
86
- parameters: {
87
- readonly first?: number | void | null;
88
- readonly after?: string | void | null;
89
- };
83
+ parameters: object;
90
84
  data: object;
91
85
  },
92
86
  TItem,
93
87
  >(
94
- loadableField: LoadableField<TReadFromStore, Connection<TItem>>,
88
+ loadableField: LoadableField<
89
+ TReadFromStore,
90
+ Connection<TItem>,
91
+ UseConnectionSpecPaginationArgs
92
+ >,
93
+ pageInfo?: PageInfo,
95
94
  ): UsePaginationReturnValue<TReadFromStore, TItem> {
96
95
  const networkRequestOptions = {
97
96
  suspendIfInFlight: true,
@@ -178,16 +177,11 @@ export function useConnectionSpecPagination<
178
177
  }
179
178
 
180
179
  const getFetchMore =
181
- (after: string | null | undefined) =>
182
- (
183
- args: OmitFirstAfter<TReadFromStore['parameters']>,
184
- first: number,
185
- ): void => {
186
- // @ts-expect-error
180
+ (after: string | null) =>
181
+ (count: number): void => {
187
182
  const loadedField = loadableField({
188
- ...args,
189
183
  after: after,
190
- first: first,
184
+ first: count,
191
185
  })[1]();
192
186
  const newPointer = createReferenceCountedPointer(loadedField);
193
187
  const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
@@ -278,9 +272,9 @@ export function useConnectionSpecPagination<
278
272
  if (!networkRequestStatus) {
279
273
  return {
280
274
  kind: 'Complete',
281
- fetchMore: getFetchMore(null),
275
+ fetchMore: getFetchMore(pageInfo?.endCursor ?? null),
282
276
  results: [],
283
- hasNextPage: true,
277
+ hasNextPage: pageInfo?.hasNextPage ?? true,
284
278
  };
285
279
  }
286
280
 
@@ -26,7 +26,11 @@ export function useImperativeLoadableField<
26
26
  TResult,
27
27
  TProvidedArgs extends object,
28
28
  >(
29
- loadableField: LoadableField<TReadFromStore, TResult, TProvidedArgs>,
29
+ loadableField: LoadableField<
30
+ TReadFromStore,
31
+ TResult,
32
+ Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
33
+ >,
30
34
  ): UseImperativeLoadableFieldReturn<TReadFromStore, TResult, TProvidedArgs> {
31
35
  const { state, setState } =
32
36
  useUpdatableDisposableState<FragmentReference<TReadFromStore, TResult>>();
@@ -18,19 +18,13 @@ import { getPromiseState, readPromise } from '../core/PromiseWrapper';
18
18
  import { type WithEncounteredRecords } from '../core/read';
19
19
  import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
20
20
 
21
- type SkipOrLimit = 'skip' | 'limit';
22
- type OmitSkipLimit<TArgs> = keyof Omit<TArgs, SkipOrLimit> extends never
23
- ? void | Record<string, never>
24
- : Omit<TArgs, SkipOrLimit>;
25
-
26
21
  type UseSkipLimitReturnValue<
27
22
  TReadFromStore extends { data: object; parameters: object },
28
- TArgs,
29
23
  TItem,
30
24
  > =
31
25
  | {
32
26
  readonly kind: 'Complete';
33
- readonly fetchMore: (args: OmitSkipLimit<TArgs>, count: number) => void;
27
+ readonly fetchMore: (count: number) => void;
34
28
  readonly results: ReadonlyArray<TItem>;
35
29
  }
36
30
  | {
@@ -69,16 +63,27 @@ function flatten<T>(arr: ReadonlyArray<ReadonlyArray<T>>): ReadonlyArray<T> {
69
63
  return outArray;
70
64
  }
71
65
 
66
+ type UseSkipLimitPaginationArgs = {
67
+ skip: number;
68
+ limit: number;
69
+ };
70
+
72
71
  export function useSkipLimitPagination<
73
- TArgs extends {
74
- skip: number | void | null;
75
- limit: number | void | null;
76
- },
77
72
  TItem,
78
- TReadFromStore extends { parameters: TArgs; data: object },
73
+ TReadFromStore extends {
74
+ parameters: object;
75
+ data: object;
76
+ },
79
77
  >(
80
- loadableField: LoadableField<TReadFromStore, ReadonlyArray<TItem>>,
81
- ): UseSkipLimitReturnValue<TReadFromStore, TArgs, TItem> {
78
+ loadableField: LoadableField<
79
+ TReadFromStore,
80
+ ReadonlyArray<TItem>,
81
+ UseSkipLimitPaginationArgs
82
+ >,
83
+ initialArgs?: {
84
+ skip?: number | void | null;
85
+ },
86
+ ): UseSkipLimitReturnValue<TReadFromStore, TItem> {
82
87
  const networkRequestOptions = {
83
88
  suspendIfInFlight: true,
84
89
  throwOnNetworkError: true,
@@ -158,10 +163,8 @@ export function useSkipLimitPagination<
158
163
 
159
164
  const getFetchMore =
160
165
  (loadedSoFar: number) =>
161
- (args: OmitSkipLimit<TArgs>, count: number): void => {
162
- // @ts-expect-error
166
+ (count: number): void => {
163
167
  const loadedField = loadableField({
164
- ...args,
165
168
  skip: loadedSoFar,
166
169
  limit: count,
167
170
  })[1]();
@@ -252,7 +255,7 @@ export function useSkipLimitPagination<
252
255
  if (!networkRequestStatus) {
253
256
  return {
254
257
  kind: 'Complete',
255
- fetchMore: getFetchMore(0),
258
+ fetchMore: getFetchMore(initialArgs?.skip ?? 0),
256
259
  results: [],
257
260
  };
258
261
  }
@@ -285,3 +288,45 @@ export function useSkipLimitPagination<
285
288
  }
286
289
  }
287
290
  }
291
+
292
+ // @ts-ignore
293
+ function tsTests() {
294
+ type Parameters = {
295
+ readonly search: string;
296
+ readonly skip: number;
297
+ readonly limit: number;
298
+ };
299
+
300
+ let basicLoadable!: LoadableField<
301
+ {
302
+ readonly data: object;
303
+ readonly parameters: Omit<Parameters, 'search'>;
304
+ },
305
+ object[]
306
+ >;
307
+
308
+ useSkipLimitPagination(basicLoadable);
309
+ useSkipLimitPagination(basicLoadable, {});
310
+ useSkipLimitPagination(basicLoadable, { skip: 10 });
311
+
312
+ let unprovidedSearchLoadable!: LoadableField<
313
+ {
314
+ readonly data: object;
315
+ readonly parameters: Parameters;
316
+ },
317
+ object[]
318
+ >;
319
+ // @ts-expect-error
320
+ useSkipLimitPagination(unprovidedSearchLoadable);
321
+
322
+ let providedSearchLoadable!: LoadableField<
323
+ {
324
+ readonly data: object;
325
+ readonly parameters: Parameters;
326
+ },
327
+ object[],
328
+ Omit<Parameters, 'search'>
329
+ >;
330
+
331
+ useSkipLimitPagination(providedSearchLoadable);
332
+ }
@@ -8,7 +8,7 @@ export function FragmentReader<
8
8
  TProps extends Record<any, any>,
9
9
  TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>,
10
10
  >(
11
- props: TProps extends Record<string, never>
11
+ props: TProps extends Record<PropertyKey, never>
12
12
  ? {
13
13
  fragmentReference: FragmentReference<
14
14
  ExtractReadFromStore<TEntrypoint>,
@@ -5,5 +5,5 @@ export type Query__meName__param = {
5
5
  readonly name: string,
6
6
  },
7
7
  },
8
- readonly parameters: Record<string, never>,
8
+ readonly parameters: Record<PropertyKey, never>,
9
9
  };
@@ -10,5 +10,5 @@ export type Query__meNameSuccessor__param = {
10
10
  } | null),
11
11
  },
12
12
  },
13
- readonly parameters: Record<string, never>,
13
+ readonly parameters: Record<PropertyKey, never>,
14
14
  };
@@ -23,7 +23,7 @@ type IdentityWithParam<TParam extends object> = <TClientFieldReturn>(
23
23
  // whenever the @component field is rendered.
24
24
  type IdentityWithParamComponent<TParam extends object> = <
25
25
  TClientFieldReturn,
26
- TComponentProps = Record<string, never>,
26
+ TComponentProps = Record<PropertyKey, never>,
27
27
  >(
28
28
  clientComponentField: (data: TParam, componentProps: TComponentProps) => TClientFieldReturn
29
29
  ) => (data: TParam, componentProps: TComponentProps) => TClientFieldReturn;