From 50d19bc845b4d6d98eaa52e887e9c9576c1e2b0a Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:07:55 -0800 Subject: [PATCH 1/3] fix(tanstack): delegate hooks typing --- .../clients/tanstack-query/src/utils/types.ts | 6 ++- .../tanstack-query/test/react-typing-test.ts | 5 ++ .../test/schemas/basic/input.ts | 40 ++++++++++++++++ .../test/schemas/basic/models.ts | 2 + .../test/schemas/basic/schema-lite.ts | 48 +++++++++++++++++++ .../test/schemas/basic/schema.zmodel | 12 ++++- .../tanstack-query/test/svelte-typing-test.ts | 5 ++ .../tanstack-query/test/vue-typing-test.ts | 5 ++ 8 files changed, 121 insertions(+), 2 deletions(-) diff --git a/packages/clients/tanstack-query/src/utils/types.ts b/packages/clients/tanstack-query/src/utils/types.ts index 3c7fdc1d..ac7829e9 100644 --- a/packages/clients/tanstack-query/src/utils/types.ts +++ b/packages/clients/tanstack-query/src/utils/types.ts @@ -21,8 +21,12 @@ export const ORMWriteActions = [ export type ORMWriteActionType = (typeof ORMWriteActions)[number]; +type HooksOperationsIneligibleForDelegateModels = OperationsIneligibleForDelegateModels extends any + ? `use${Capitalize}` + : never; + export type TrimDelegateModelOperations< Schema extends SchemaDef, Model extends GetModels, T extends Record, -> = IsDelegateModel extends true ? Omit : T; +> = IsDelegateModel extends true ? Omit : T; diff --git a/packages/clients/tanstack-query/test/react-typing-test.ts b/packages/clients/tanstack-query/test/react-typing-test.ts index b5814dbd..999c789d 100644 --- a/packages/clients/tanstack-query/test/react-typing-test.ts +++ b/packages/clients/tanstack-query/test/react-typing-test.ts @@ -101,3 +101,8 @@ client.user.useDeleteMany().mutate({ where: { email: 'test@example.com' } }); function check(_value: unknown) { // noop } + +// @ts-expect-error delegate model +client.foo.useCreate(); +client.foo.useUpdate(); +client.bar.useCreate(); diff --git a/packages/clients/tanstack-query/test/schemas/basic/input.ts b/packages/clients/tanstack-query/test/schemas/basic/input.ts index e7b6da66..755f3b2b 100644 --- a/packages/clients/tanstack-query/test/schemas/basic/input.ts +++ b/packages/clients/tanstack-query/test/schemas/basic/input.ts @@ -68,3 +68,43 @@ export type CategorySelect = $SelectInput<$Schema, "Category">; export type CategoryInclude = $IncludeInput<$Schema, "Category">; export type CategoryOmit = $OmitInput<$Schema, "Category">; export type CategoryGetPayload> = $SimplifiedModelResult<$Schema, "Category", Args>; +export type FooFindManyArgs = $FindManyArgs<$Schema, "Foo">; +export type FooFindUniqueArgs = $FindUniqueArgs<$Schema, "Foo">; +export type FooFindFirstArgs = $FindFirstArgs<$Schema, "Foo">; +export type FooCreateArgs = $CreateArgs<$Schema, "Foo">; +export type FooCreateManyArgs = $CreateManyArgs<$Schema, "Foo">; +export type FooCreateManyAndReturnArgs = $CreateManyAndReturnArgs<$Schema, "Foo">; +export type FooUpdateArgs = $UpdateArgs<$Schema, "Foo">; +export type FooUpdateManyArgs = $UpdateManyArgs<$Schema, "Foo">; +export type FooUpdateManyAndReturnArgs = $UpdateManyAndReturnArgs<$Schema, "Foo">; +export type FooUpsertArgs = $UpsertArgs<$Schema, "Foo">; +export type FooDeleteArgs = $DeleteArgs<$Schema, "Foo">; +export type FooDeleteManyArgs = $DeleteManyArgs<$Schema, "Foo">; +export type FooCountArgs = $CountArgs<$Schema, "Foo">; +export type FooAggregateArgs = $AggregateArgs<$Schema, "Foo">; +export type FooGroupByArgs = $GroupByArgs<$Schema, "Foo">; +export type FooWhereInput = $WhereInput<$Schema, "Foo">; +export type FooSelect = $SelectInput<$Schema, "Foo">; +export type FooInclude = $IncludeInput<$Schema, "Foo">; +export type FooOmit = $OmitInput<$Schema, "Foo">; +export type FooGetPayload> = $SimplifiedModelResult<$Schema, "Foo", Args>; +export type BarFindManyArgs = $FindManyArgs<$Schema, "Bar">; +export type BarFindUniqueArgs = $FindUniqueArgs<$Schema, "Bar">; +export type BarFindFirstArgs = $FindFirstArgs<$Schema, "Bar">; +export type BarCreateArgs = $CreateArgs<$Schema, "Bar">; +export type BarCreateManyArgs = $CreateManyArgs<$Schema, "Bar">; +export type BarCreateManyAndReturnArgs = $CreateManyAndReturnArgs<$Schema, "Bar">; +export type BarUpdateArgs = $UpdateArgs<$Schema, "Bar">; +export type BarUpdateManyArgs = $UpdateManyArgs<$Schema, "Bar">; +export type BarUpdateManyAndReturnArgs = $UpdateManyAndReturnArgs<$Schema, "Bar">; +export type BarUpsertArgs = $UpsertArgs<$Schema, "Bar">; +export type BarDeleteArgs = $DeleteArgs<$Schema, "Bar">; +export type BarDeleteManyArgs = $DeleteManyArgs<$Schema, "Bar">; +export type BarCountArgs = $CountArgs<$Schema, "Bar">; +export type BarAggregateArgs = $AggregateArgs<$Schema, "Bar">; +export type BarGroupByArgs = $GroupByArgs<$Schema, "Bar">; +export type BarWhereInput = $WhereInput<$Schema, "Bar">; +export type BarSelect = $SelectInput<$Schema, "Bar">; +export type BarInclude = $IncludeInput<$Schema, "Bar">; +export type BarOmit = $OmitInput<$Schema, "Bar">; +export type BarGetPayload> = $SimplifiedModelResult<$Schema, "Bar", Args>; diff --git a/packages/clients/tanstack-query/test/schemas/basic/models.ts b/packages/clients/tanstack-query/test/schemas/basic/models.ts index da3e5d00..a4bcedbb 100644 --- a/packages/clients/tanstack-query/test/schemas/basic/models.ts +++ b/packages/clients/tanstack-query/test/schemas/basic/models.ts @@ -10,3 +10,5 @@ import { type ModelResult as $ModelResult } from "@zenstackhq/orm"; export type User = $ModelResult<$Schema, "User">; export type Post = $ModelResult<$Schema, "Post">; export type Category = $ModelResult<$Schema, "Category">; +export type Foo = $ModelResult<$Schema, "Foo">; +export type Bar = $ModelResult<$Schema, "Bar">; diff --git a/packages/clients/tanstack-query/test/schemas/basic/schema-lite.ts b/packages/clients/tanstack-query/test/schemas/basic/schema-lite.ts index 347ccbe1..ea44666f 100644 --- a/packages/clients/tanstack-query/test/schemas/basic/schema-lite.ts +++ b/packages/clients/tanstack-query/test/schemas/basic/schema-lite.ts @@ -116,6 +116,54 @@ export const schema = { id: { type: "String" }, name: { type: "String" } } + }, + Foo: { + name: "Foo", + fields: { + id: { + name: "id", + type: "String", + id: true, + default: ExpressionUtils.call("cuid") + }, + type: { + name: "type", + type: "String", + isDiscriminator: true + } + }, + idFields: ["id"], + uniqueFields: { + id: { type: "String" } + }, + isDelegate: true, + subModels: ["Bar"] + }, + Bar: { + name: "Bar", + baseModel: "Foo", + fields: { + id: { + name: "id", + type: "String", + id: true, + default: ExpressionUtils.call("cuid") + }, + type: { + name: "type", + type: "String", + originModel: "Foo", + isDiscriminator: true + }, + title: { + name: "title", + type: "String" + } + }, + idFields: ["id"], + uniqueFields: { + id: { type: "String" } + } } }, authType: "User", diff --git a/packages/clients/tanstack-query/test/schemas/basic/schema.zmodel b/packages/clients/tanstack-query/test/schemas/basic/schema.zmodel index 039051df..d274e95c 100644 --- a/packages/clients/tanstack-query/test/schemas/basic/schema.zmodel +++ b/packages/clients/tanstack-query/test/schemas/basic/schema.zmodel @@ -22,4 +22,14 @@ model Category { id String @id @default(cuid()) name String @unique posts Post[] -} \ No newline at end of file +} + +model Foo { + id String @id @default(cuid()) + type String + @@delegate(type) +} + +model Bar extends Foo { + title String +} diff --git a/packages/clients/tanstack-query/test/svelte-typing-test.ts b/packages/clients/tanstack-query/test/svelte-typing-test.ts index b39c1566..7dc7886c 100644 --- a/packages/clients/tanstack-query/test/svelte-typing-test.ts +++ b/packages/clients/tanstack-query/test/svelte-typing-test.ts @@ -98,3 +98,8 @@ get(client.user.useDeleteMany()).mutate({ where: { email: 'test@example.com' } } function check(_value: unknown) { // noop } + +// @ts-expect-error delegate model +client.foo.useCreate(); +client.foo.useUpdate(); +client.bar.useCreate(); diff --git a/packages/clients/tanstack-query/test/vue-typing-test.ts b/packages/clients/tanstack-query/test/vue-typing-test.ts index 5d99e318..546340bd 100644 --- a/packages/clients/tanstack-query/test/vue-typing-test.ts +++ b/packages/clients/tanstack-query/test/vue-typing-test.ts @@ -99,3 +99,8 @@ client.user.useDeleteMany().mutate({ where: { email: 'test@example.com' } }); function check(_value: unknown) { // noop } + +// @ts-expect-error delegate model +client.foo.useCreate(); +client.foo.useUpdate(); +client.bar.useCreate(); From 359635620696aaee6160cce1c6c2dcbb080aea52 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:14:14 -0800 Subject: [PATCH 2/3] fix dropped query args --- packages/clients/tanstack-query/src/react.ts | 24 +++++++++---------- packages/clients/tanstack-query/src/svelte.ts | 12 +++++----- packages/clients/tanstack-query/src/vue.ts | 12 +++++----- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/clients/tanstack-query/src/react.ts b/packages/clients/tanstack-query/src/react.ts index d9e0ca6d..15bfbb51 100644 --- a/packages/clients/tanstack-query/src/react.ts +++ b/packages/clients/tanstack-query/src/react.ts @@ -344,28 +344,28 @@ export function useModelQueries { - return useInternalQuery(schema, modelName, 'count', undefined, options); + useCount: (args: any, options?: any) => { + return useInternalQuery(schema, modelName, 'count', args, options); }, - useSuspenseCount: (options?: any) => { - return useInternalSuspenseQuery(schema, modelName, 'count', undefined, options); + useSuspenseCount: (args: any, options?: any) => { + return useInternalSuspenseQuery(schema, modelName, 'count', args, options); }, - useAggregate: (options?: any) => { - return useInternalQuery(schema, modelName, 'aggregate', undefined, options); + useAggregate: (args: any, options?: any) => { + return useInternalQuery(schema, modelName, 'aggregate', args, options); }, - useSuspenseAggregate: (options?: any) => { - return useInternalSuspenseQuery(schema, modelName, 'aggregate', undefined, options); + useSuspenseAggregate: (args: any, options?: any) => { + return useInternalSuspenseQuery(schema, modelName, 'aggregate', args, options); }, - useGroupBy: (options?: any) => { - return useInternalQuery(schema, modelName, 'groupBy', undefined, options); + useGroupBy: (args: any, options?: any) => { + return useInternalQuery(schema, modelName, 'groupBy', args, options); }, - useSuspenseGroupBy: (options?: any) => { - return useInternalSuspenseQuery(schema, modelName, 'groupBy', undefined, options); + useSuspenseGroupBy: (args: any, options?: any) => { + return useInternalSuspenseQuery(schema, modelName, 'groupBy', args, options); }, } as ModelQueryHooks; } diff --git a/packages/clients/tanstack-query/src/svelte.ts b/packages/clients/tanstack-query/src/svelte.ts index 29004aee..33cf86bd 100644 --- a/packages/clients/tanstack-query/src/svelte.ts +++ b/packages/clients/tanstack-query/src/svelte.ts @@ -283,16 +283,16 @@ export function useModelQueries { - return useInternalQuery(schema, modelName, 'count', undefined, options); + useCount: (args: any, options?: any) => { + return useInternalQuery(schema, modelName, 'count', args, options); }, - useAggregate: (options?: any) => { - return useInternalQuery(schema, modelName, 'aggregate', undefined, options); + useAggregate: (args: any, options?: any) => { + return useInternalQuery(schema, modelName, 'aggregate', args, options); }, - useGroupBy: (options?: any) => { - return useInternalQuery(schema, modelName, 'groupBy', undefined, options); + useGroupBy: (args: any, options?: any) => { + return useInternalQuery(schema, modelName, 'groupBy', args, options); }, } as ModelQueryHooks; } diff --git a/packages/clients/tanstack-query/src/vue.ts b/packages/clients/tanstack-query/src/vue.ts index 77d3ab34..8239ce97 100644 --- a/packages/clients/tanstack-query/src/vue.ts +++ b/packages/clients/tanstack-query/src/vue.ts @@ -272,16 +272,16 @@ export function useModelQueries { - return useInternalQuery(schema, modelName, 'count', undefined, options); + useCount: (args: any, options?: any) => { + return useInternalQuery(schema, modelName, 'count', args, options); }, - useAggregate: (options?: any) => { - return useInternalQuery(schema, modelName, 'aggregate', undefined, options); + useAggregate: (args: any, options?: any) => { + return useInternalQuery(schema, modelName, 'aggregate', args, options); }, - useGroupBy: (options?: any) => { - return useInternalQuery(schema, modelName, 'groupBy', undefined, options); + useGroupBy: (args: any, options?: any) => { + return useInternalQuery(schema, modelName, 'groupBy', args, options); }, } as ModelQueryHooks; } From 10966d46233acb6389cb79718ed1337ef1ed5564 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:15:40 -0800 Subject: [PATCH 3/3] update --- packages/clients/tanstack-query/test/react-typing-test.ts | 1 + packages/clients/tanstack-query/test/svelte-typing-test.ts | 1 + packages/clients/tanstack-query/test/vue-typing-test.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/packages/clients/tanstack-query/test/react-typing-test.ts b/packages/clients/tanstack-query/test/react-typing-test.ts index 999c789d..02d7a2e3 100644 --- a/packages/clients/tanstack-query/test/react-typing-test.ts +++ b/packages/clients/tanstack-query/test/react-typing-test.ts @@ -104,5 +104,6 @@ function check(_value: unknown) { // @ts-expect-error delegate model client.foo.useCreate(); + client.foo.useUpdate(); client.bar.useCreate(); diff --git a/packages/clients/tanstack-query/test/svelte-typing-test.ts b/packages/clients/tanstack-query/test/svelte-typing-test.ts index 7dc7886c..62735112 100644 --- a/packages/clients/tanstack-query/test/svelte-typing-test.ts +++ b/packages/clients/tanstack-query/test/svelte-typing-test.ts @@ -101,5 +101,6 @@ function check(_value: unknown) { // @ts-expect-error delegate model client.foo.useCreate(); + client.foo.useUpdate(); client.bar.useCreate(); diff --git a/packages/clients/tanstack-query/test/vue-typing-test.ts b/packages/clients/tanstack-query/test/vue-typing-test.ts index 546340bd..07b980c5 100644 --- a/packages/clients/tanstack-query/test/vue-typing-test.ts +++ b/packages/clients/tanstack-query/test/vue-typing-test.ts @@ -102,5 +102,6 @@ function check(_value: unknown) { // @ts-expect-error delegate model client.foo.useCreate(); + client.foo.useUpdate(); client.bar.useCreate();