From fe0661da089032e3f33df8fa103716fd300e2201 Mon Sep 17 00:00:00 2001 From: Bereket Engida Date: Tue, 21 Jan 2025 19:42:34 +0300 Subject: [PATCH] fix: improve additional fields inference ts server performance --- .../better-auth/src/api/routes/sign-up.ts | 15 +++--- .../better-auth/src/api/routes/update-user.ts | 17 ++++--- packages/better-auth/src/db/field.ts | 2 +- packages/better-auth/src/types/to-zod.ts | 46 ------------------- 4 files changed, 17 insertions(+), 63 deletions(-) delete mode 100644 packages/better-auth/src/types/to-zod.ts diff --git a/packages/better-auth/src/api/routes/sign-up.ts b/packages/better-auth/src/api/routes/sign-up.ts index 52d97a49cc..b11abf764b 100644 --- a/packages/better-auth/src/api/routes/sign-up.ts +++ b/packages/better-auth/src/api/routes/sign-up.ts @@ -8,7 +8,6 @@ import type { BetterAuthOptions, User, } from "../../types"; -import type { toZod } from "../../types/to-zod"; import { parseUserInput } from "../../db/schema"; import { BASE_ERROR_CODES } from "../../error/codes"; import { isDevelopment } from "../../utils/env"; @@ -18,13 +17,15 @@ export const signUpEmail = () => "/sign-up/email", { method: "POST", - body: z.record(z.string(), z.any()) as unknown as ZodObject<{ - name: ZodString; - email: ZodString; - password: ZodString; - }> & - toZod>, + body: z.record(z.string(), z.any()), metadata: { + $Infer: { + body: {} as { + name: string; + email: string; + password: string; + } & AdditionalUserFieldsInput, + }, openapi: { description: "Sign up a user using email and password", requestBody: { diff --git a/packages/better-auth/src/api/routes/update-user.ts b/packages/better-auth/src/api/routes/update-user.ts index b2f614f27b..bc4a4bef65 100644 --- a/packages/better-auth/src/api/routes/update-user.ts +++ b/packages/better-auth/src/api/routes/update-user.ts @@ -1,11 +1,10 @@ -import { z, ZodNull, ZodObject, ZodOptional, ZodString } from "zod"; +import { z } from "zod"; import { createAuthEndpoint } from "../call"; import { deleteSessionCookie, setSessionCookie } from "../../cookies"; import { getSessionFromCtx, sessionMiddleware } from "./session"; import { APIError } from "better-call"; import { createEmailVerificationToken } from "./email-verification"; -import type { toZod } from "../../types/to-zod"; import type { AdditionalUserFieldsInput, BetterAuthOptions } from "../../types"; import { parseUserInput } from "../../db/schema"; import { generateRandomString } from "../../crypto"; @@ -17,15 +16,15 @@ export const updateUser = () => "/update-user", { method: "POST", - body: z.record(z.string(), z.any()) as unknown as toZod< - AdditionalUserFieldsInput - > & - ZodObject<{ - name: ZodOptional; - image: ZodOptional; - }>, + body: z.record(z.string(), z.any()), use: [sessionMiddleware], metadata: { + $Infer: { + body: {} as AdditionalUserFieldsInput & { + name?: string; + image?: string | null; + }, + }, openapi: { description: "Update the current user", requestBody: { diff --git a/packages/better-auth/src/db/field.ts b/packages/better-auth/src/db/field.ts index cd70579d78..c3150072e7 100644 --- a/packages/better-auth/src/db/field.ts +++ b/packages/better-auth/src/db/field.ts @@ -153,7 +153,7 @@ export type InferFieldsInput = Field extends Record< ? never : key]: InferFieldInput; } & { - [key in Key as Field[key]["input"] extends false ? never : key]: + [key in Key as Field[key]["input"] extends false ? never : key]?: | InferFieldInput | undefined | null; diff --git a/packages/better-auth/src/types/to-zod.ts b/packages/better-auth/src/types/to-zod.ts deleted file mode 100644 index 73dbdf9107..0000000000 --- a/packages/better-auth/src/types/to-zod.ts +++ /dev/null @@ -1,46 +0,0 @@ -//https://github.com/colinhacks/tozod/blob/master/src/index.ts - -import * as z from "zod"; - -type isAny = [any extends T ? "true" : "false"] extends ["true"] - ? true - : false; -type nonoptional = T extends undefined ? never : T; -type nonnullable = T extends null ? never : T; -type equals = [X] extends [Y] ? ([Y] extends [X] ? true : false) : false; - -export type toZod = { - any: never; - optional: z.ZodUnion<[toZod>, z.ZodUndefined]>; - nullable: z.ZodUnion<[toZod>, z.ZodNull]>; - array: T extends Array ? z.ZodArray> : never; - string: z.ZodString; - bigint: z.ZodBigInt; - number: z.ZodNumber; - boolean: z.ZodBoolean; - date: z.ZodDate; - object: z.ZodObject<{ [k in keyof T]: toZod }>; - rest: never; -}[zodKey]; - -type zodKey = isAny extends true - ? "any" - : equals extends true //[T] extends [booleanUtil.Type] - ? "boolean" - : [undefined] extends [T] - ? "optional" - : [null] extends [T] - ? "nullable" - : T extends any[] - ? "array" - : equals extends true - ? "string" - : equals extends true //[T] extends [bigintUtil.Type] - ? "bigint" - : equals extends true //[T] extends [numberUtil.Type] - ? "number" - : equals extends true //[T] extends [dateUtil.Type] - ? "date" - : T extends { [k: string]: any } //[T] extends [structUtil.Type] - ? "object" - : "rest";