diff --git a/packages/clients/tanstack-query/src/react.ts b/packages/clients/tanstack-query/src/react.ts index a8f55b9c..b5763ce3 100644 --- a/packages/clients/tanstack-query/src/react.ts +++ b/packages/clients/tanstack-query/src/react.ts @@ -31,13 +31,13 @@ import type { CreateManyArgs, DeleteArgs, DeleteManyArgs, - FindArgs, + FindFirstArgs, + FindManyArgs, FindUniqueArgs, GroupByArgs, GroupByResult, - ModelResult, - SelectIncludeOmit, SelectSubset, + SimplifiedModelResult, Subset, UpdateArgs, UpdateManyAndReturnArgs, @@ -126,13 +126,13 @@ export type ModelMutationResult = UseMutationResult, - TArgs extends SelectIncludeOmit, + TArgs, Array extends boolean = false, -> = Omit, TArgs>, 'mutateAsync'> & { +> = Omit, TArgs>, 'mutateAsync'> & { mutateAsync( args: T, - options?: ModelMutationOptions, T>, - ): Promise[] : ModelResult>; + options?: ModelMutationOptions, T>, + ): Promise>; }; export type ClientHooks = { @@ -145,108 +145,108 @@ export type ModelQueryHooks>( + useFindUnique>( args: SelectSubset>, - options?: ModelQueryOptions | null>, - ): ModelQueryResult | null>; + options?: ModelQueryOptions | null>, + ): ModelQueryResult | null>; - useSuspenseFindUnique>( + useSuspenseFindUnique>( args: SelectSubset>, - options?: ModelSuspenseQueryOptions | null>, - ): ModelSuspenseQueryResult | null>; - - useFindFirst>( - args?: SelectSubset>, - options?: ModelQueryOptions | null>, - ): ModelQueryResult | null>; - - useSuspenseFindFirst>( - args?: SelectSubset>, - options?: ModelSuspenseQueryOptions | null>, - ): ModelSuspenseQueryResult | null>; - - useFindMany>( - args?: SelectSubset>, - options?: ModelQueryOptions[]>, - ): ModelQueryResult[]>; - - useSuspenseFindMany>( - args?: SelectSubset>, - options?: ModelSuspenseQueryOptions[]>, - ): ModelSuspenseQueryResult[]>; - - useInfiniteFindMany>( - args?: SelectSubset>, - options?: ModelInfiniteQueryOptions[]>, - ): ModelInfiniteQueryResult[]>>; - - useSuspenseInfiniteFindMany>( - args?: SelectSubset>, - options?: ModelSuspenseInfiniteQueryOptions[]>, - ): ModelSuspenseInfiniteQueryResult[]>>; - - useCreate>( - options?: ModelMutationOptions, T>, + options?: ModelSuspenseQueryOptions | null>, + ): ModelSuspenseQueryResult | null>; + + useFindFirst>( + args?: SelectSubset>, + options?: ModelQueryOptions | null>, + ): ModelQueryResult | null>; + + useSuspenseFindFirst>( + args?: SelectSubset>, + options?: ModelSuspenseQueryOptions | null>, + ): ModelSuspenseQueryResult | null>; + + useFindMany>( + args?: SelectSubset>, + options?: ModelQueryOptions[]>, + ): ModelQueryResult[]>; + + useSuspenseFindMany>( + args?: SelectSubset>, + options?: ModelSuspenseQueryOptions[]>, + ): ModelSuspenseQueryResult[]>; + + useInfiniteFindMany>( + args?: SelectSubset>, + options?: ModelInfiniteQueryOptions[]>, + ): ModelInfiniteQueryResult[]>>; + + useSuspenseInfiniteFindMany>( + args?: SelectSubset>, + options?: ModelSuspenseInfiniteQueryOptions[]>, + ): ModelSuspenseInfiniteQueryResult[]>>; + + useCreate>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useCreateMany>( + useCreateMany>( options?: ModelMutationOptions, ): ModelMutationResult; - useCreateManyAndReturn>( - options?: ModelMutationOptions[], T>, + useCreateManyAndReturn>( + options?: ModelMutationOptions[], T>, ): ModelMutationModelResult; - useUpdate>( - options?: ModelMutationOptions, T>, + useUpdate>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useUpdateMany>( + useUpdateMany>( options?: ModelMutationOptions, ): ModelMutationResult; - useUpdateManyAndReturn>( - options?: ModelMutationOptions[], T>, + useUpdateManyAndReturn>( + options?: ModelMutationOptions[], T>, ): ModelMutationModelResult; - useUpsert>( - options?: ModelMutationOptions, T>, + useUpsert>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useDelete>( - options?: ModelMutationOptions, T>, + useDelete>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useDeleteMany>( + useDeleteMany>( options?: ModelMutationOptions, ): ModelMutationResult; - useCount>( + useCount>( args?: Subset>, options?: ModelQueryOptions>, ): ModelQueryResult>; - useSuspenseCount>( + useSuspenseCount>( args?: Subset>, options?: ModelSuspenseQueryOptions>, ): ModelSuspenseQueryResult>; - useAggregate>( + useAggregate>( args: Subset>, options?: ModelQueryOptions>, ): ModelQueryResult>; - useSuspenseAggregate>( + useSuspenseAggregate>( args: Subset>, options?: ModelSuspenseQueryOptions>, ): ModelSuspenseQueryResult>; - useGroupBy>( + useGroupBy>( args: Subset>, options?: ModelQueryOptions>, ): ModelQueryResult>; - useSuspenseGroupBy>( + useSuspenseGroupBy>( args: Subset>, options?: ModelSuspenseQueryOptions>, ): ModelSuspenseQueryResult>; diff --git a/packages/clients/tanstack-query/src/svelte.ts b/packages/clients/tanstack-query/src/svelte.ts index 3cd81476..e05840a2 100644 --- a/packages/clients/tanstack-query/src/svelte.ts +++ b/packages/clients/tanstack-query/src/svelte.ts @@ -27,13 +27,13 @@ import type { CreateManyArgs, DeleteArgs, DeleteManyArgs, - FindArgs, + FindFirstArgs, + FindManyArgs, FindUniqueArgs, GroupByArgs, GroupByResult, - ModelResult, - SelectIncludeOmit, SelectSubset, + SimplifiedModelResult, Subset, UpdateArgs, UpdateManyAndReturnArgs, @@ -114,14 +114,17 @@ export type ModelMutationResult = CreateMutationResult, - TArgs extends SelectIncludeOmit, + TArgs, Array extends boolean = false, > = Readable< - Omit, TArgs>>, 'mutateAsync'> & { + Omit< + UnwrapStore, TArgs>>, + 'mutateAsync' + > & { mutateAsync( args: T, - options?: ModelMutationOptions, T>, - ): Promise[] : ModelResult>; + options?: ModelMutationOptions, T>, + ): Promise>; } >; @@ -135,73 +138,73 @@ export type ModelQueryHooks>( + useFindUnique>( args: SelectSubset>, - options?: ModelQueryOptions | null>, - ): ModelQueryResult | null>; - - useFindFirst>( - args?: SelectSubset>, - options?: ModelQueryOptions | null>, - ): ModelQueryResult | null>; - - useFindMany>( - args?: SelectSubset>, - options?: ModelQueryOptions[]>, - ): ModelQueryResult[]>; - - useInfiniteFindMany>( - args?: SelectSubset>, - options?: ModelInfiniteQueryOptions[]>, - ): ModelInfiniteQueryResult[]>>; - - useCreate>( - options?: ModelMutationOptions, T>, + options?: ModelQueryOptions | null>, + ): ModelQueryResult | null>; + + useFindFirst>( + args?: SelectSubset>, + options?: ModelQueryOptions | null>, + ): ModelQueryResult | null>; + + useFindMany>( + args?: SelectSubset>, + options?: ModelQueryOptions[]>, + ): ModelQueryResult[]>; + + useInfiniteFindMany>( + args?: SelectSubset>, + options?: ModelInfiniteQueryOptions[]>, + ): ModelInfiniteQueryResult[]>>; + + useCreate>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useCreateMany>( + useCreateMany>( options?: ModelMutationOptions, ): ModelMutationResult; - useCreateManyAndReturn>( - options?: ModelMutationOptions[], T>, + useCreateManyAndReturn>( + options?: ModelMutationOptions[], T>, ): ModelMutationModelResult; - useUpdate>( - options?: ModelMutationOptions, T>, + useUpdate>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useUpdateMany>( + useUpdateMany>( options?: ModelMutationOptions, ): ModelMutationResult; - useUpdateManyAndReturn>( - options?: ModelMutationOptions[], T>, + useUpdateManyAndReturn>( + options?: ModelMutationOptions[], T>, ): ModelMutationModelResult; - useUpsert>( - options?: ModelMutationOptions, T>, + useUpsert>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useDelete>( - options?: ModelMutationOptions, T>, + useDelete>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useDeleteMany>( + useDeleteMany>( options?: ModelMutationOptions, ): ModelMutationResult; - useCount>( + useCount>( args?: Subset>, options?: ModelQueryOptions>, ): ModelQueryResult>; - useAggregate>( + useAggregate>( args: Subset>, options?: ModelQueryOptions>, ): ModelQueryResult>; - useGroupBy>( + useGroupBy>( args: Subset>, options?: ModelQueryOptions>, ): ModelQueryResult>; diff --git a/packages/clients/tanstack-query/src/vue.ts b/packages/clients/tanstack-query/src/vue.ts index 2623f014..5c71f319 100644 --- a/packages/clients/tanstack-query/src/vue.ts +++ b/packages/clients/tanstack-query/src/vue.ts @@ -25,13 +25,13 @@ import type { CreateManyArgs, DeleteArgs, DeleteManyArgs, - FindArgs, + FindFirstArgs, + FindManyArgs, FindUniqueArgs, GroupByArgs, GroupByResult, - ModelResult, - SelectIncludeOmit, SelectSubset, + SimplifiedModelResult, Subset, UpdateArgs, UpdateManyAndReturnArgs, @@ -103,13 +103,13 @@ export type ModelMutationResult = UseMutationReturnType, - TArgs extends SelectIncludeOmit, + TArgs, Array extends boolean = false, -> = Omit, TArgs>, 'mutateAsync'> & { +> = Omit, TArgs>, 'mutateAsync'> & { mutateAsync( args: T, - options?: ModelMutationOptions, T>, - ): Promise[] : ModelResult>; + options?: ModelMutationOptions, T>, + ): Promise>; }; export type ClientHooks = { @@ -122,73 +122,73 @@ export type ModelQueryHooks>( + useFindUnique>( args: SelectSubset>, - options?: ModelQueryOptions | null>, - ): ModelQueryResult | null>; - - useFindFirst>( - args?: SelectSubset>, - options?: ModelQueryOptions | null>, - ): ModelQueryResult | null>; - - useFindMany>( - args?: SelectSubset>, - options?: ModelQueryOptions[]>, - ): ModelQueryResult[]>; - - useInfiniteFindMany>( - args?: SelectSubset>, - options?: ModelInfiniteQueryOptions[]>, - ): ModelInfiniteQueryResult[]>>; - - useCreate>( - options?: ModelMutationOptions, T>, + options?: ModelQueryOptions | null>, + ): ModelQueryResult | null>; + + useFindFirst>( + args?: SelectSubset>, + options?: ModelQueryOptions | null>, + ): ModelQueryResult | null>; + + useFindMany>( + args?: SelectSubset>, + options?: ModelQueryOptions[]>, + ): ModelQueryResult[]>; + + useInfiniteFindMany>( + args?: SelectSubset>, + options?: ModelInfiniteQueryOptions[]>, + ): ModelInfiniteQueryResult[]>>; + + useCreate>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useCreateMany>( + useCreateMany>( options?: ModelMutationOptions, ): ModelMutationResult; - useCreateManyAndReturn>( - options?: ModelMutationOptions[], T>, + useCreateManyAndReturn>( + options?: ModelMutationOptions[], T>, ): ModelMutationModelResult; - useUpdate>( - options?: ModelMutationOptions, T>, + useUpdate>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useUpdateMany>( + useUpdateMany>( options?: ModelMutationOptions, ): ModelMutationResult; - useUpdateManyAndReturn>( - options?: ModelMutationOptions[], T>, + useUpdateManyAndReturn>( + options?: ModelMutationOptions[], T>, ): ModelMutationModelResult; - useUpsert>( - options?: ModelMutationOptions, T>, + useUpsert>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useDelete>( - options?: ModelMutationOptions, T>, + useDelete>( + options?: ModelMutationOptions, T>, ): ModelMutationModelResult; - useDeleteMany>( + useDeleteMany>( options?: ModelMutationOptions, ): ModelMutationResult; - useCount>( + useCount>( args?: Subset>, options?: ModelQueryOptions>, ): ModelQueryResult>; - useAggregate>( + useAggregate>( args: Subset>, options?: ModelQueryOptions>, ): ModelQueryResult>; - useGroupBy>( + useGroupBy>( args: Subset>, options?: ModelQueryOptions>, ): ModelQueryResult>; diff --git a/packages/clients/tanstack-query/test/react-query.test.tsx b/packages/clients/tanstack-query/test/react-query.test.tsx index e9ea8295..9a178f48 100644 --- a/packages/clients/tanstack-query/test/react-query.test.tsx +++ b/packages/clients/tanstack-query/test/react-query.test.tsx @@ -25,7 +25,7 @@ describe('React Query Test', () => { const Provider = QuerySettingsProvider; const wrapper = ({ children }: { children: React.ReactNode }) => ( - {children} + {children} ); return { queryClient, wrapper }; diff --git a/packages/orm/src/client/contract.ts b/packages/orm/src/client/contract.ts index e9383162..7f1fd48c 100644 --- a/packages/orm/src/client/contract.ts +++ b/packages/orm/src/client/contract.ts @@ -14,12 +14,14 @@ import type { CreateManyArgs, DeleteArgs, DeleteManyArgs, - FindArgs, + FindFirstArgs, + FindManyArgs, FindUniqueArgs, GroupByArgs, GroupByResult, ModelResult, SelectSubset, + SimplifiedModelResult, Subset, UpdateArgs, UpdateManyAndReturnArgs, @@ -323,9 +325,9 @@ export type AllModelOperations>( - args?: SelectSubset>, - ): ZenStackPromise>[]>; + findMany>( + args?: SelectSubset>, + ): ZenStackPromise[]>; /** * Returns a uniquely identified entity. @@ -333,9 +335,9 @@ export type AllModelOperations>( + findUnique>( args: SelectSubset>, - ): ZenStackPromise> | null>; + ): ZenStackPromise | null>; /** * Returns a uniquely identified entity or throws `NotFoundError` if not found. @@ -343,9 +345,9 @@ export type AllModelOperations>( + findUniqueOrThrow>( args: SelectSubset>, - ): ZenStackPromise>>; + ): ZenStackPromise>; /** * Returns the first entity. @@ -353,9 +355,9 @@ export type AllModelOperations>( - args?: SelectSubset>, - ): ZenStackPromise> | null>; + findFirst>( + args?: SelectSubset>, + ): ZenStackPromise | null>; /** * Returns the first entity or throws `NotFoundError` if not found. @@ -363,9 +365,9 @@ export type AllModelOperations>( - args?: SelectSubset>, - ): ZenStackPromise>>; + findFirstOrThrow>( + args?: SelectSubset>, + ): ZenStackPromise>; /** * Creates a new entity. @@ -419,9 +421,9 @@ export type AllModelOperations>( + create>( args: SelectSubset>, - ): ZenStackPromise>>; + ): ZenStackPromise>; /** * Creates multiple entities. Only scalar fields are allowed. @@ -448,7 +450,7 @@ export type AllModelOperations>( + createMany>( args?: SelectSubset>, ): ZenStackPromise; @@ -470,9 +472,9 @@ export type AllModelOperations>( + createManyAndReturn>( args?: SelectSubset>, - ): ZenStackPromise>[]>; + ): ZenStackPromise[]>; /** * Updates a uniquely identified entity. @@ -591,9 +593,9 @@ export type AllModelOperations>( + update>( args: SelectSubset>, - ): ZenStackPromise>>; + ): ZenStackPromise>; /** * Updates multiple entities. @@ -615,7 +617,7 @@ export type AllModelOperations>( + updateMany>( args: Subset>, ): ZenStackPromise; @@ -641,9 +643,9 @@ export type AllModelOperations>( + updateManyAndReturn>( args: Subset>, - ): ZenStackPromise>[]>; + ): ZenStackPromise[]>; /** * Creates or updates an entity. @@ -665,9 +667,9 @@ export type AllModelOperations>( + upsert>( args: SelectSubset>, - ): ZenStackPromise>>; + ): ZenStackPromise>; /** * Deletes a uniquely identifiable entity. @@ -688,9 +690,9 @@ export type AllModelOperations>( + delete>( args: SelectSubset>, - ): ZenStackPromise>>; + ): ZenStackPromise>; /** * Deletes multiple entities. @@ -711,7 +713,7 @@ export type AllModelOperations>( + deleteMany>( args?: Subset>, ): ZenStackPromise; @@ -733,7 +735,7 @@ export type AllModelOperations>( + count>( args?: Subset>, ): ZenStackPromise>>; @@ -754,7 +756,7 @@ export type AllModelOperations>( + aggregate>( args: Subset>, ): ZenStackPromise>>; @@ -791,7 +793,7 @@ export type AllModelOperations>( + groupBy>( args: Subset>, ): ZenStackPromise>>; }; diff --git a/packages/orm/src/client/crud-types.ts b/packages/orm/src/client/crud-types.ts index fd9714ed..e1af448f 100644 --- a/packages/orm/src/client/crud-types.ts +++ b/packages/orm/src/client/crud-types.ts @@ -39,6 +39,7 @@ import type { Optional, OrArray, Simplify, + SimplifyIf, ValueOfPotentialTuple, WrapType, XOR, @@ -135,7 +136,7 @@ type SelectCountResult export type ModelResult< Schema extends SchemaDef, Model extends GetModels, - Args extends SelectIncludeOmit = {}, + Args = {}, Optional = false, Array = false, > = WrapType< @@ -181,7 +182,7 @@ export type ModelResult< export type SimplifiedModelResult< Schema extends SchemaDef, Model extends GetModels, - Args extends SelectIncludeOmit = {}, + Args = {}, Optional = false, Array = false, > = Simplify>; @@ -663,33 +664,64 @@ export type FindArgs< (AllowFilter extends true ? FilterArgs : {}) & SelectIncludeOmit; -export type FindManyArgs> = FindArgs; -export type FindFirstArgs> = FindArgs; +export type FindManyArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf, Simplify>; -export type FindUniqueArgs> = { - where?: WhereUniqueInput; -} & SelectIncludeOmit; +export type FindFirstArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf, Simplify>; + +export type FindUniqueArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + { + where?: WhereUniqueInput; + } & SelectIncludeOmit, + Simplify +>; //#endregion //#region Create args -export type CreateArgs> = { - data: CreateInput; - select?: SelectInput; - include?: IncludeInput; - omit?: OmitInput; -}; +export type CreateArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + { + data: CreateInput; + select?: SelectInput; + include?: IncludeInput; + omit?: OmitInput; + }, + Simplify +>; -export type CreateManyArgs> = CreateManyInput; +export type CreateManyArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf, Simplify>; -export type CreateManyAndReturnArgs> = CreateManyInput< - Schema, - Model -> & { - select?: SelectInput; - omit?: OmitInput; -}; +export type CreateManyAndReturnArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + CreateManyInput & { + select?: SelectInput; + omit?: OmitInput; + }, + Simplify +>; type OptionalWrap, T extends object> = Optional< T, @@ -707,17 +739,20 @@ type CreateScalarPayload; +// For unknown reason toplevel `Simplify` can't simplify this type, so we added an extra layer +// to make it work type ScalarCreatePayload< Schema extends SchemaDef, Model extends GetModels, Field extends ScalarFields, -> = +> = Simplify< | MapModelFieldType | (FieldIsArray extends true ? { set?: MapModelFieldType; } - : never); + : never) +>; type CreateFKPayload> = OptionalWrap< Schema, @@ -812,26 +847,38 @@ type NestedCreateManyInput< // #region Update args -export type UpdateArgs> = { - data: UpdateInput; - where: WhereUniqueInput; - select?: SelectInput; - include?: IncludeInput; - omit?: OmitInput; -}; - -export type UpdateManyArgs> = UpdateManyPayload< - Schema, - Model +export type UpdateArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + { + data: UpdateInput; + where: WhereUniqueInput; + select?: SelectInput; + include?: IncludeInput; + omit?: OmitInput; + }, + Simplify >; -export type UpdateManyAndReturnArgs> = UpdateManyPayload< - Schema, - Model -> & { - select?: SelectInput; - omit?: OmitInput; -}; +export type UpdateManyArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf, Simplify>; + +export type UpdateManyAndReturnArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + UpdateManyPayload & { + select?: SelectInput; + omit?: OmitInput; + }, + Simplify +>; type UpdateManyPayload, Without extends string = never> = { data: OrArray>; @@ -839,14 +886,21 @@ type UpdateManyPayload limit?: number; }; -export type UpsertArgs> = { - create: CreateInput; - update: UpdateInput; - where: WhereUniqueInput; - select?: SelectInput; - include?: IncludeInput; - omit?: OmitInput; -}; +export type UpsertArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + { + create: CreateInput; + update: UpdateInput; + where: WhereUniqueInput; + select?: SelectInput; + include?: IncludeInput; + omit?: OmitInput; + }, + Simplify +>; type UpdateScalarInput< Schema extends SchemaDef, @@ -958,38 +1012,54 @@ type ToOneRelationUpdateInput< // #region Delete args -export type DeleteArgs> = { - where: WhereUniqueInput; - select?: SelectInput; - include?: IncludeInput; - omit?: OmitInput; -}; +export type DeleteArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + { + where: WhereUniqueInput; + select?: SelectInput; + include?: IncludeInput; + omit?: OmitInput; + }, + Simplify +>; -export type DeleteManyArgs> = { - where?: WhereInput; - limit?: number; -}; +export type DeleteManyArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + { + where?: WhereInput; + limit?: number; + }, + Simplify +>; // #endregion // #region Count args -export type CountArgs> = Omit< - FindArgs, - 'select' | 'include' | 'distinct' | 'omit' -> & { - select?: CountAggregateInput | true; -}; +export type CountArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + Omit, 'select' | 'include' | 'distinct' | 'omit'> & { + select?: CountAggregateInput | true; + }, + Simplify +>; type CountAggregateInput> = { [Key in NonRelationFields]?: true; } & { _all?: true }; -export type CountResult< - Schema extends SchemaDef, - Model extends GetModels, - Args extends CountArgs, -> = Args extends { select: infer S } +export type CountResult, Args> = Args extends { + select: infer S; +} ? S extends true ? number : { @@ -1001,21 +1071,28 @@ export type CountResult< // #region Aggregate -export type AggregateArgs> = { - where?: WhereInput; - skip?: number; - take?: number; - orderBy?: OrArray>; -} & { - _count?: true | CountAggregateInput; - _min?: MinMaxInput; - _max?: MinMaxInput; -} & (NumericFields extends never - ? {} - : { - _avg?: SumAvgInput; - _sum?: SumAvgInput; - }); +export type AggregateArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + { + where?: WhereInput; + skip?: number; + take?: number; + orderBy?: OrArray>; + } & { + _count?: true | CountAggregateInput; + _min?: MinMaxInput; + _max?: MinMaxInput; + } & (NumericFields extends never + ? {} + : { + _avg?: SumAvgInput; + _sum?: SumAvgInput; + }), + Simplify +>; type NumericFields> = keyof { [Key in GetModelFields as GetModelFieldType extends @@ -1041,11 +1118,9 @@ type MinMaxInput, Valu : Key]?: ValueType; }; -export type AggregateResult< - Schema extends SchemaDef, - Model extends GetModels, - Args extends AggregateArgs, -> = (Args extends { _count: infer Count } +export type AggregateResult, Args> = (Args extends { + _count: infer Count; +} ? { _count: AggCommonOutput; } @@ -1088,29 +1163,36 @@ type GroupByHaving> = '$expr' >; -export type GroupByArgs> = { - where?: WhereInput; - orderBy?: OrArray>; - by: NonRelationFields | NonEmptyArray>; - having?: GroupByHaving; - take?: number; - skip?: number; - // aggregations - _count?: true | CountAggregateInput; - _min?: MinMaxInput; - _max?: MinMaxInput; -} & (NumericFields extends never - ? {} - : { - // aggregations specific to numeric fields - _avg?: SumAvgInput; - _sum?: SumAvgInput; - }); +export type GroupByArgs< + Schema extends SchemaDef, + Model extends GetModels, + Simplify extends boolean = false, +> = SimplifyIf< + { + where?: WhereInput; + orderBy?: OrArray>; + by: NonRelationFields | NonEmptyArray>; + having?: GroupByHaving; + take?: number; + skip?: number; + // aggregations + _count?: true | CountAggregateInput; + _min?: MinMaxInput; + _max?: MinMaxInput; + } & (NumericFields extends never + ? {} + : { + // aggregations specific to numeric fields + _avg?: SumAvgInput; + _sum?: SumAvgInput; + }), + Simplify +>; export type GroupByResult< Schema extends SchemaDef, Model extends GetModels, - Args extends GroupByArgs, + Args extends { by: unknown }, > = Array< { [Key in NonRelationFields as Key extends ValueOfPotentialTuple diff --git a/packages/orm/src/client/crud/validator/index.ts b/packages/orm/src/client/crud/validator/index.ts index 4cd9c584..dc3e9f5f 100644 --- a/packages/orm/src/client/crud/validator/index.ts +++ b/packages/orm/src/client/crud/validator/index.ts @@ -65,14 +65,18 @@ export class InputValidator { return this.client.$options.validateInput !== false; } - validateFindArgs(model: GetModels, args: unknown, options: { unique: boolean; findOne: boolean }) { + validateFindArgs( + model: GetModels, + args: unknown, + options: { unique: boolean; findOne: boolean }, + ): FindArgs, true> | undefined { return this.validate< FindArgs, true> | undefined, Parameters[1] >(model, 'find', options, (model, options) => this.makeFindSchema(model, options), args); } - validateCreateArgs(model: GetModels, args: unknown) { + validateCreateArgs(model: GetModels, args: unknown): CreateArgs> { return this.validate>>( model, 'create', @@ -82,8 +86,8 @@ export class InputValidator { ); } - validateCreateManyArgs(model: GetModels, args: unknown) { - return this.validate>, undefined>( + validateCreateManyArgs(model: GetModels, args: unknown): CreateManyArgs> { + return this.validate>>( model, 'createMany', undefined, @@ -92,7 +96,10 @@ export class InputValidator { ); } - validateCreateManyAndReturnArgs(model: GetModels, args: unknown) { + validateCreateManyAndReturnArgs( + model: GetModels, + args: unknown, + ): CreateManyAndReturnArgs> | undefined { return this.validate> | undefined>( model, 'createManyAndReturn', @@ -102,7 +109,7 @@ export class InputValidator { ); } - validateUpdateArgs(model: GetModels, args: unknown) { + validateUpdateArgs(model: GetModels, args: unknown): UpdateArgs> { return this.validate>>( model, 'update', @@ -112,7 +119,7 @@ export class InputValidator { ); } - validateUpdateManyArgs(model: GetModels, args: unknown) { + validateUpdateManyArgs(model: GetModels, args: unknown): UpdateManyArgs> { return this.validate>>( model, 'updateMany', @@ -122,8 +129,11 @@ export class InputValidator { ); } - validateUpdateManyAndReturnArgs(model: GetModels, args: unknown) { - return this.validate> | undefined>( + validateUpdateManyAndReturnArgs( + model: GetModels, + args: unknown, + ): UpdateManyAndReturnArgs> { + return this.validate>>( model, 'updateManyAndReturn', undefined, @@ -132,7 +142,7 @@ export class InputValidator { ); } - validateUpsertArgs(model: GetModels, args: unknown) { + validateUpsertArgs(model: GetModels, args: unknown): UpsertArgs> { return this.validate>>( model, 'upsert', @@ -142,7 +152,7 @@ export class InputValidator { ); } - validateDeleteArgs(model: GetModels, args: unknown) { + validateDeleteArgs(model: GetModels, args: unknown): DeleteArgs> { return this.validate>>( model, 'delete', @@ -152,7 +162,10 @@ export class InputValidator { ); } - validateDeleteManyArgs(model: GetModels, args: unknown) { + validateDeleteManyArgs( + model: GetModels, + args: unknown, + ): DeleteManyArgs> | undefined { return this.validate> | undefined>( model, 'deleteMany', @@ -162,8 +175,8 @@ export class InputValidator { ); } - validateCountArgs(model: GetModels, args: unknown) { - return this.validate> | undefined, undefined>( + validateCountArgs(model: GetModels, args: unknown): CountArgs> | undefined { + return this.validate> | undefined>( model, 'count', undefined, @@ -172,8 +185,8 @@ export class InputValidator { ); } - validateAggregateArgs(model: GetModels, args: unknown) { - return this.validate>, undefined>( + validateAggregateArgs(model: GetModels, args: unknown): AggregateArgs> { + return this.validate>>( model, 'aggregate', undefined, @@ -182,8 +195,8 @@ export class InputValidator { ); } - validateGroupByArgs(model: GetModels, args: unknown) { - return this.validate>, undefined>( + validateGroupByArgs(model: GetModels, args: unknown): GroupByArgs> { + return this.validate>>( model, 'groupBy', undefined, diff --git a/packages/orm/src/utils/type-utils.ts b/packages/orm/src/utils/type-utils.ts index e5cd1f33..47b4e095 100644 --- a/packages/orm/src/utils/type-utils.ts +++ b/packages/orm/src/utils/type-utils.ts @@ -16,6 +16,8 @@ export type Simplify = D extends 0 : { [K in keyof T]: Simplify } & {} : T; +export type SimplifyIf = Condition extends true ? Simplify : T; + export type WrapType = Array extends true ? Optional extends true ? T[] | null