Skip to content

Commit ddc1b14

Browse files
authored
merge dev to main (v3.5.6) (#2566)
2 parents 14780c3 + 39a0a28 commit ddc1b14

File tree

34 files changed

+265
-96
lines changed

34 files changed

+265
-96
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "zenstack-v3",
33
"displayName": "ZenStack",
44
"description": "ZenStack",
5-
"version": "3.5.5",
5+
"version": "3.5.6",
66
"type": "module",
77
"author": {
88
"name": "ZenStack Team",

packages/auth-adapters/better-auth/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@zenstackhq/better-auth",
33
"displayName": "ZenStack Better Auth Adapter",
44
"description": "ZenStack Better Auth Adapter. This adapter is modified from better-auth's Prisma adapter.",
5-
"version": "3.5.5",
5+
"version": "3.5.6",
66
"type": "module",
77
"author": {
88
"name": "ZenStack Team",

packages/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@zenstackhq/cli",
33
"displayName": "ZenStack CLI",
44
"description": "FullStack database toolkit with built-in access control and automatic API generation.",
5-
"version": "3.5.5",
5+
"version": "3.5.6",
66
"type": "module",
77
"author": {
88
"name": "ZenStack Team",

packages/clients/client-helpers/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@zenstackhq/client-helpers",
33
"displayName": "ZenStack Client Helpers",
44
"description": "Helpers for implementing clients that consume ZenStack's CRUD service",
5-
"version": "3.5.5",
5+
"version": "3.5.6",
66
"type": "module",
77
"author": {
88
"name": "ZenStack Team",

packages/clients/tanstack-query/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@zenstackhq/tanstack-query",
33
"displayName": "ZenStack TanStack Query Integration",
44
"description": "TanStack Query Client for consuming ZenStack v3's CRUD service",
5-
"version": "3.5.5",
5+
"version": "3.5.6",
66
"type": "module",
77
"author": {
88
"name": "ZenStack Team",

packages/clients/tanstack-query/src/react.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,15 @@ export type ModelSuspenseQueryResult<T> = UseSuspenseQueryResult<WithOptimistic<
119119
queryKey: QueryKey;
120120
};
121121

122-
export type ModelInfiniteQueryOptions<T> = Omit<
123-
UseInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>,
122+
export type ModelInfiniteQueryOptions<T, TPageParam = unknown> = Omit<
123+
UseInfiniteQueryOptions<T, DefaultError, InfiniteData<T, TPageParam>, QueryKey, TPageParam>,
124124
'queryKey' | 'initialPageParam'
125125
>;
126126

127127
export type ModelInfiniteQueryResult<T> = UseInfiniteQueryResult<T, DefaultError> & { queryKey: QueryKey };
128128

129-
export type ModelSuspenseInfiniteQueryOptions<T> = Omit<
130-
UseSuspenseInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>,
129+
export type ModelSuspenseInfiniteQueryOptions<T, TPageParam = unknown> = Omit<
130+
UseSuspenseInfiniteQueryOptions<T, DefaultError, InfiniteData<T, TPageParam>, QueryKey, TPageParam>,
131131
'queryKey' | 'initialPageParam'
132132
>;
133133

@@ -263,15 +263,15 @@ export type ModelQueryHooks<
263263
options?: ModelSuspenseQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>,
264264
): ModelSuspenseQueryResult<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>;
265265

266-
useInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>>(
266+
useInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>, TPageParam = unknown>(
267267
args?: SelectSubset<T, FindManyArgs<Schema, Model, Options, {}, ExtResult>>,
268-
options?: ModelInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>,
269-
): ModelInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>;
268+
options?: ModelInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], TPageParam>,
269+
): ModelInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], TPageParam>>;
270270

271-
useSuspenseInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>>(
271+
useSuspenseInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>, TPageParam = unknown>(
272272
args?: SelectSubset<T, FindManyArgs<Schema, Model, Options, {}, ExtResult>>,
273-
options?: ModelSuspenseInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>,
274-
): ModelSuspenseInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>;
273+
options?: ModelSuspenseInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], TPageParam>,
274+
): ModelSuspenseInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], TPageParam>>;
275275

276276
useCreate<T extends CreateArgs<Schema, Model, Options, {}, ExtResult>>(
277277
options?: ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>, T>,
@@ -592,14 +592,14 @@ export function useInternalSuspenseQuery<TQueryFnData, TData>(
592592
};
593593
}
594594

595-
export function useInternalInfiniteQuery<TQueryFnData, TData>(
595+
export function useInternalInfiniteQuery<TQueryFnData, TData, TPageParam = unknown>(
596596
_schema: SchemaDef,
597597
model: string,
598598
operation: string,
599599
args: unknown,
600600
options:
601601
| (Omit<
602-
UseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>>,
602+
UseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData, TPageParam>, QueryKey, TPageParam>,
603603
'queryKey' | 'initialPageParam'
604604
> &
605605
QueryContext)
@@ -615,19 +615,19 @@ export function useInternalInfiniteQuery<TQueryFnData, TData>(
615615
queryFn: ({ pageParam, signal }) => {
616616
return fetcher<TQueryFnData>(makeUrl(endpoint, model, operation, pageParam ?? args), { signal }, fetch);
617617
},
618-
initialPageParam: args,
618+
initialPageParam: args as TPageParam,
619619
...options,
620620
}),
621621
};
622622
}
623623

624-
export function useInternalSuspenseInfiniteQuery<TQueryFnData, TData>(
624+
export function useInternalSuspenseInfiniteQuery<TQueryFnData, TData, TPageParam = unknown>(
625625
_schema: SchemaDef,
626626
model: string,
627627
operation: string,
628628
args: unknown,
629629
options: Omit<
630-
UseSuspenseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>> & QueryContext,
630+
UseSuspenseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData, TPageParam>, QueryKey, TPageParam> & QueryContext,
631631
'queryKey' | 'initialPageParam'
632632
>,
633633
) {
@@ -640,7 +640,7 @@ export function useInternalSuspenseInfiniteQuery<TQueryFnData, TData>(
640640
queryFn: ({ pageParam, signal }) => {
641641
return fetcher<TQueryFnData>(makeUrl(endpoint, model, operation, pageParam ?? args), { signal }, fetch);
642642
},
643-
initialPageParam: args,
643+
initialPageParam: args as TPageParam,
644644
...options,
645645
}),
646646
};

packages/clients/tanstack-query/src/svelte/index.svelte.ts

Lines changed: 66 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ export type ModelQueryOptions<T> = Omit<CreateQueryOptions<T, DefaultError>, 'qu
125125

126126
export type ModelQueryResult<T> = CreateQueryResult<WithOptimistic<T>, DefaultError> & { queryKey: QueryKey };
127127

128-
export type ModelInfiniteQueryOptions<T> = Omit<
129-
CreateInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>,
128+
export type ModelInfiniteQueryOptions<T, TPageParam = unknown> = Omit<
129+
CreateInfiniteQueryOptions<T, DefaultError, InfiniteData<T, TPageParam>, QueryKey, TPageParam>,
130130
'queryKey' | 'initialPageParam'
131131
> &
132132
QueryContext;
@@ -147,7 +147,10 @@ export type ModelMutationModelResult<
147147
Array extends boolean = false,
148148
Options extends QueryOptions<Schema> = QueryOptions<Schema>,
149149
ExtResult extends ExtResultBase<Schema> = {},
150-
> = Omit<ModelMutationResult<SimplifiedResult<Schema, Model, TArgs, Options, false, Array, ExtResult>, TArgs>, 'mutateAsync'> & {
150+
> = Omit<
151+
ModelMutationResult<SimplifiedResult<Schema, Model, TArgs, Options, false, Array, ExtResult>, TArgs>,
152+
'mutateAsync'
153+
> & {
151154
mutateAsync<T extends TArgs>(
152155
args: T,
153156
options?: ModelMutationOptions<SimplifiedResult<Schema, Model, T, Options, false, Array, ExtResult>, T>,
@@ -159,7 +162,12 @@ export type ClientHooks<
159162
Options extends QueryOptions<Schema> = QueryOptions<Schema>,
160163
ExtResult extends ExtResultBase<Schema> = {},
161164
> = {
162-
[Model in GetSlicedModels<Schema, Options> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model, Options, ExtResult>;
165+
[Model in GetSlicedModels<Schema, Options> as `${Uncapitalize<Model>}`]: ModelQueryHooks<
166+
Schema,
167+
Model,
168+
Options,
169+
ExtResult
170+
>;
163171
} & ProcedureHooks<Schema, Options>;
164172

165173
type ProcedureHookGroup<Schema extends SchemaDef, Options extends QueryOptions<Schema>> = {
@@ -238,10 +246,14 @@ export type ModelQueryHooks<
238246
options?: Accessor<ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>,
239247
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>;
240248

241-
useInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>>(
249+
useInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>, TPageParam = unknown>(
242250
args?: Accessor<SelectSubset<T, FindManyArgs<Schema, Model, Options, {}, ExtResult>>>,
243-
options?: Accessor<ModelInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>,
244-
): ModelInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>;
251+
options?: Accessor<
252+
ModelInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], TPageParam>
253+
>,
254+
): ModelInfiniteQueryResult<
255+
InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], TPageParam>
256+
>;
245257

246258
useCreate<T extends CreateArgs<Schema, Model, Options, {}, ExtResult>>(
247259
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>, T>>,
@@ -310,23 +322,20 @@ export type ModelQueryHooks<
310322
* const client = useClientQueries<DbType>(schema)
311323
* ```
312324
*/
313-
export function useClientQueries<
314-
SchemaOrClient extends SchemaDef | ClientContract<any, any, any, any, any>,
315-
>(
325+
export function useClientQueries<SchemaOrClient extends SchemaDef | ClientContract<any, any, any, any, any>>(
316326
schema: InferSchema<SchemaOrClient>,
317327
options?: Accessor<QueryContext>,
318-
): ClientHooks<InferSchema<SchemaOrClient>, InferOptions<SchemaOrClient, InferSchema<SchemaOrClient>>, InferExtResult<SchemaOrClient> extends ExtResultBase<InferSchema<SchemaOrClient>> ? InferExtResult<SchemaOrClient> : {}> {
319-
const result = Object.keys(schema.models).reduce(
320-
(acc, model) => {
321-
(acc as any)[lowerCaseFirst(model)] = useModelQueries(
322-
schema as any,
323-
model as any,
324-
options,
325-
);
326-
return acc;
327-
},
328-
{} as any,
329-
);
328+
): ClientHooks<
329+
InferSchema<SchemaOrClient>,
330+
InferOptions<SchemaOrClient, InferSchema<SchemaOrClient>>,
331+
InferExtResult<SchemaOrClient> extends ExtResultBase<InferSchema<SchemaOrClient>>
332+
? InferExtResult<SchemaOrClient>
333+
: {}
334+
> {
335+
const result = Object.keys(schema.models).reduce((acc, model) => {
336+
(acc as any)[lowerCaseFirst(model)] = useModelQueries(schema as any, model as any, options);
337+
return acc;
338+
}, {} as any);
330339

331340
const procedures = (schema as any).procedures as Record<string, { mutation?: boolean }> | undefined;
332341
if (procedures) {
@@ -376,7 +385,11 @@ export function useModelQueries<
376385
Model extends GetModels<Schema>,
377386
Options extends QueryOptions<Schema>,
378387
ExtResult extends ExtResultBase<Schema> = {},
379-
>(schema: Schema, model: Model, rootOptions?: Accessor<QueryContext>): ModelQueryHooks<Schema, Model, Options, ExtResult> {
388+
>(
389+
schema: Schema,
390+
model: Model,
391+
rootOptions?: Accessor<QueryContext>,
392+
): ModelQueryHooks<Schema, Model, Options, ExtResult> {
380393
const modelDef = Object.values(schema.models).find((m) => m.name.toLowerCase() === model.toLowerCase());
381394
if (!modelDef) {
382395
throw new Error(`Model "${model}" not found in schema`);
@@ -487,36 +500,58 @@ export function useInternalQuery<TQueryFnData, TData>(
487500
return createQueryResult(query, queryKey);
488501
}
489502

490-
export function useInternalInfiniteQuery<TQueryFnData, TData>(
503+
export function useInternalInfiniteQuery<TQueryFnData, TData, TPageParam = unknown>(
491504
_schema: SchemaDef,
492505
model: string,
493506
operation: string,
494-
args: Accessor<unknown>,
507+
args?: Accessor<unknown>,
495508
options?: Accessor<
496509
Omit<
497-
CreateInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>>,
510+
CreateInfiniteQueryOptions<
511+
TQueryFnData,
512+
DefaultError,
513+
InfiniteData<TData, TPageParam>,
514+
QueryKey,
515+
TPageParam
516+
>,
498517
'queryKey' | 'initialPageParam'
499518
> &
500519
QueryContext
501520
>,
502521
) {
503522
const { endpoint, fetch } = useFetchOptions(options);
504523

505-
const queryKey = $derived(getQueryKey(model, operation, args(), { infinite: true, optimisticUpdate: false }));
524+
const queryKey = $derived(getQueryKey(model, operation, args?.(), { infinite: true, optimisticUpdate: false }));
506525

507526
const finalOptions = () => {
508-
const queryFn: QueryFunction<TQueryFnData, QueryKey, unknown> = ({ pageParam, signal }) =>
509-
fetcher<TQueryFnData>(makeUrl(endpoint, model, operation, pageParam ?? args()), { signal }, fetch);
527+
const queryFn: QueryFunction<TQueryFnData, QueryKey, TPageParam> = ({ pageParam, signal }) =>
528+
fetcher<TQueryFnData>(makeUrl(endpoint, model, operation, pageParam ?? args?.()), { signal }, fetch);
510529
const optionsValue = options?.() ?? { getNextPageParam: () => undefined };
511530
return {
512531
queryKey,
513532
queryFn,
514-
initialPageParam: args(),
533+
initialPageParam: args?.() as TPageParam,
515534
...optionsValue,
516535
};
517536
};
518537

519-
const query = createInfiniteQuery<TQueryFnData, DefaultError, InfiniteData<TData>>(finalOptions);
538+
const query = createInfiniteQuery<
539+
TQueryFnData,
540+
DefaultError,
541+
InfiniteData<TData, TPageParam>,
542+
QueryKey,
543+
TPageParam
544+
>(
545+
finalOptions as unknown as Accessor<
546+
CreateInfiniteQueryOptions<
547+
TQueryFnData,
548+
DefaultError,
549+
InfiniteData<TData, TPageParam>,
550+
QueryKey,
551+
TPageParam
552+
>
553+
>,
554+
);
520555
// svelte-ignore state_referenced_locally
521556
return createQueryResult(query, queryKey);
522557
}

packages/clients/tanstack-query/src/vue.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,11 @@ export type ModelQueryOptions<T> = MaybeRefOrGetter<
118118

119119
export type ModelQueryResult<T> = UseQueryReturnType<WithOptimistic<T>, DefaultError> & { queryKey: Ref<QueryKey> };
120120

121-
export type ModelInfiniteQueryOptions<T> = MaybeRefOrGetter<
122-
Omit<UnwrapRef<UseInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>>, 'queryKey' | 'initialPageParam'> &
121+
export type ModelInfiniteQueryOptions<T, TPageParam = unknown> = MaybeRefOrGetter<
122+
Omit<
123+
UnwrapRef<UseInfiniteQueryOptions<T, DefaultError, InfiniteData<T, TPageParam>, QueryKey, TPageParam>>,
124+
'queryKey' | 'initialPageParam'
125+
> &
123126
QueryContext
124127
>;
125128

@@ -241,10 +244,10 @@ export type ModelQueryHooks<
241244
options?: MaybeRefOrGetter<ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>,
242245
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>;
243246

244-
useInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>>(
247+
useInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>, TPageParam = unknown>(
245248
args?: MaybeRefOrGetter<SelectSubset<T, FindManyArgs<Schema, Model, Options, {}, ExtResult>>>,
246-
options?: MaybeRefOrGetter<ModelInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>,
247-
): ModelInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>;
249+
options?: MaybeRefOrGetter<ModelInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], TPageParam>>,
250+
): ModelInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], TPageParam>>;
248251

249252
useCreate<T extends CreateArgs<Schema, Model, Options, {}, ExtResult>>(
250253
options?: MaybeRefOrGetter<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>, T>>,
@@ -510,14 +513,16 @@ export function useInternalQuery<TQueryFnData, TData>(
510513
return { queryKey, ...useQuery<TQueryFnData, DefaultError, TData>(finalOptions) };
511514
}
512515

513-
export function useInternalInfiniteQuery<TQueryFnData, TData>(
516+
export function useInternalInfiniteQuery<TQueryFnData, TData, TPageParam = unknown>(
514517
_schema: SchemaDef,
515518
model: string,
516519
operation: string,
517520
args: MaybeRefOrGetter<unknown>,
518521
options: MaybeRefOrGetter<
519522
| (Omit<
520-
UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>>>,
523+
UnwrapRef<
524+
UseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData, TPageParam>, QueryKey, TPageParam>
525+
>,
521526
'queryKey' | 'initialPageParam'
522527
> &
523528
QueryContext)
@@ -543,7 +548,7 @@ export function useInternalInfiniteQuery<TQueryFnData, TData>(
543548
const reqUrl = makeUrl(endpoint, model, operation, argsValue);
544549
return fetcher<TQueryFnData>(reqUrl, { signal }, fetch);
545550
},
546-
initialPageParam: toValue(argsValue),
551+
initialPageParam: toValue(argsValue) as TPageParam,
547552
...toValue(options),
548553
};
549554
});

packages/clients/tanstack-query/test/react-typing.test-d.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ describe('React client typing test', () => {
3737
},
3838
).data?.pages[1]?.[0]?.email,
3939
);
40+
41+
// TPageParam should be inferred from getNextPageParam, not typed as unknown
42+
const infiniteResult = client.user.useInfiniteFindMany(
43+
{},
44+
{
45+
getNextPageParam: (_lastPage, _allPages, lastPageParam: { cursor: string }) => lastPageParam,
46+
},
47+
);
48+
check(infiniteResult.data?.pageParams[0]?.cursor);
49+
4050
// @ts-expect-error
4151
check(client.user.useInfiniteFindMany().data?.pages[0]?.[0]?.$optimistic);
4252

packages/clients/tanstack-query/test/svelte-typing-test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ check(
4343
// @ts-expect-error
4444
check(client.user.useInfiniteFindMany().data?.pages[0]?.[0]?.$optimistic);
4545

46+
// TPageParam should be inferred from getNextPageParam, not typed as unknown
47+
const infiniteResult = client.user.useInfiniteFindMany(
48+
() => ({}),
49+
() => ({
50+
getNextPageParam: (_lastPage: unknown, _allPages: unknown, lastPageParam: { cursor: string }) => lastPageParam,
51+
}),
52+
);
53+
check(infiniteResult.data?.pageParams[0]?.cursor);
54+
4655
check(client.user.useCount().data?.toFixed(2));
4756
check(client.user.useCount(() => ({ select: { email: true } })).data?.email.toFixed(2));
4857

0 commit comments

Comments
 (0)