From fd186921106e6c95587125a3a5a2916a5c22eb67 Mon Sep 17 00:00:00 2001 From: Asis Ferrer Date: Mon, 11 May 2026 18:59:30 +0200 Subject: [PATCH] refactor: update Zod schemas to v4 --- src/lib/schemas/asset.schemas.ts | 12 +++++++++--- src/lib/schemas/assignment.schemas.ts | 18 +++++++++++++----- src/lib/schemas/auth.schemas.ts | 8 ++++++-- src/lib/schemas/category.schemas.ts | 2 +- src/lib/schemas/import.schemas.ts | 5 ++--- src/lib/schemas/item.schemas.ts | 20 +++++++++++++++----- src/lib/schemas/movement.schemas.ts | 4 +++- src/lib/schemas/recipients.schemas.ts | 16 +++++++++++----- 8 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/lib/schemas/asset.schemas.ts b/src/lib/schemas/asset.schemas.ts index ebd5a99..08506f6 100644 --- a/src/lib/schemas/asset.schemas.ts +++ b/src/lib/schemas/asset.schemas.ts @@ -2,8 +2,12 @@ import { z } from "zod" export const assetSchema = z.object({ id: z.string().optional(), - itemId: z.string().min(1, { message: "Item is required" }), - serialNumber: z.string().min(1, { message: "Serial number is required" }), + itemId: z.string().min(1, { + error: "Item is required" +}), + serialNumber: z.string().min(1, { + error: "Serial number is required" +}), deliveryNote: z.string().optional(), notes: z.string().optional(), recipientId: z.string().optional(), @@ -16,7 +20,9 @@ export const createAssetSchema = assetSchema.extend({ export type CreateAssetFormType = z.infer export const updateAssetSchema = assetSchema.extend({ - id: z.string().min(1, { message: "ID is required" }), + id: z.string().min(1, { + error: "ID is required" +}), status: z.enum(["AVAILABLE", "ASSIGNED", "RESERVED", "IN_REPAIR"]), }) diff --git a/src/lib/schemas/assignment.schemas.ts b/src/lib/schemas/assignment.schemas.ts index ddbdbc8..d0668d2 100644 --- a/src/lib/schemas/assignment.schemas.ts +++ b/src/lib/schemas/assignment.schemas.ts @@ -6,11 +6,17 @@ export const assignmentSchema = z.object({ .number() .int() .nonnegative() - .min(1, { message: "Quantity is required" }), + .min(1, { + error: "Quantity is required" + }), notes: z.string().optional(), - itemId: z.string().min(1, { message: "Item is required" }).optional(), + itemId: z.string().min(1, { + error: "Item is required" +}).optional(), assetId: z.string().optional(), - recipientId: z.string().min(1, { message: "Recipient is required" }), + recipientId: z.string().min(1, { + error: "Recipient is required" +}), assignmentDate: z.date().optional(), returnDate: z.date().optional(), }) @@ -28,7 +34,7 @@ export const updateAssignmentSchema = assignmentSchema .superRefine((data, ctx) => { if (data.itemId && !data.assetId) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Asset ID is required when item ID is provided", path: ["assetId"], }) @@ -38,6 +44,8 @@ export const updateAssignmentSchema = assignmentSchema export type UpdateAssignmentFormType = z.infer export const returnAssignmentSchema = z.object({ - id: z.string().min(1, { message: "Assignment ID is required" }), + id: z.string().min(1, { + error: "Assignment ID is required" +}), }) export type ReturnAssignmentFormType = z.infer diff --git a/src/lib/schemas/auth.schemas.ts b/src/lib/schemas/auth.schemas.ts index 875ca0f..15b7320 100644 --- a/src/lib/schemas/auth.schemas.ts +++ b/src/lib/schemas/auth.schemas.ts @@ -3,11 +3,15 @@ import { z } from "zod" export const signInSchema = z.object({ username: z .string() - .min(1, { message: "Invalid username" }) + .min(1, { + error: "Invalid username" + }) .nonempty("Username is required"), password: z .string() - .min(3, { message: "Password is too short" }) + .min(3, { + error: "Password is too short" + }) .nonempty("Password is required"), }) diff --git a/src/lib/schemas/category.schemas.ts b/src/lib/schemas/category.schemas.ts index f721f4f..11f9c05 100644 --- a/src/lib/schemas/category.schemas.ts +++ b/src/lib/schemas/category.schemas.ts @@ -4,7 +4,7 @@ export const createCategorySchema = z.object({ name: z .string() .min(3, { - message: "Name is required and must be at least 3 characters long", + error: "Name is required and must be at least 3 characters long" }) .nonempty("Name is required and must be at least 3 characters long"), }) diff --git a/src/lib/schemas/import.schemas.ts b/src/lib/schemas/import.schemas.ts index 87f9ce4..86a32df 100644 --- a/src/lib/schemas/import.schemas.ts +++ b/src/lib/schemas/import.schemas.ts @@ -3,10 +3,9 @@ import { z } from "zod" const ACCEPTED_MIME_TYPES = ["text/csv", "text/comma-separated-values"] export const importSchema = z.object({ - file: z - .instanceof(File) + file: z.file() .refine((file) => ACCEPTED_MIME_TYPES.includes(file.type), { - message: "File must be a CSV", + error: "File must be a CSV" }), categoryId: z.string().optional(), }) diff --git a/src/lib/schemas/item.schemas.ts b/src/lib/schemas/item.schemas.ts index 144e5ed..f990844 100644 --- a/src/lib/schemas/item.schemas.ts +++ b/src/lib/schemas/item.schemas.ts @@ -1,25 +1,35 @@ import { z } from "zod" export const createItemSchema = z.object({ - name: z.string().min(1, { message: "Name is required" }), - categoryId: z.string().min(1, { message: "Category is required" }), + name: z.string().min(1, { + error: "Name is required" +}), + categoryId: z.string().min(1, { + error: "Category is required" +}), stock: z.coerce .number() .int() .nonnegative() - .min(0, { message: "Stock is required" }), + .min(0, { + error: "Stock is required" + }), }) export type CreateItemFormType = z.infer export const updateItemSchema = createItemSchema.extend({ - id: z.string().min(1, { message: "Item is required" }), + id: z.string().min(1, { + error: "Item is required" +}), }) export type UpdateItemFormType = z.infer export const getItemByIdSchema = z.object({ - id: z.string().min(1, { message: "Item is required" }), + id: z.string().min(1, { + error: "Item is required" +}), }) export type GetItemByIdFormType = z.infer diff --git a/src/lib/schemas/movement.schemas.ts b/src/lib/schemas/movement.schemas.ts index 6340123..383cfef 100644 --- a/src/lib/schemas/movement.schemas.ts +++ b/src/lib/schemas/movement.schemas.ts @@ -6,7 +6,9 @@ export const movementSchema = z.object({ .number() .int() .nonnegative() - .min(1, { message: "Quantity is required" }), + .min(1, { + error: "Quantity is required" + }), details: z.string().optional(), notes: z.string().optional(), itemId: z.string().optional(), diff --git a/src/lib/schemas/recipients.schemas.ts b/src/lib/schemas/recipients.schemas.ts index 1136e29..7cc7615 100644 --- a/src/lib/schemas/recipients.schemas.ts +++ b/src/lib/schemas/recipients.schemas.ts @@ -4,10 +4,16 @@ export const recipientSchema = z.object({ id: z.string().optional(), username: z .string() - .min(1, { message: "Username is required" }) + .min(1, { + error: "Username is required" + }) .nonempty("Username is required"), - firstName: z.string().min(1, { message: "First name is required" }), - lastName: z.string().min(1, { message: "Last name is required" }), + firstName: z.string().min(1, { + error: "First name is required" +}), + lastName: z.string().min(1, { + error: "Last name is required" +}), department: z.enum( [ "IT", @@ -20,7 +26,7 @@ export const recipientSchema = z.object({ "OTHER", ], { - message: "Department is required", + error: "Department is required" }, ), email: z.string().optional().nullable(), @@ -31,7 +37,7 @@ export const createRecipientSchema = recipientSchema.superRefine( (data, ctx) => { if (data.email && !z.string().email().safeParse(data.email).success) { ctx.addIssue({ - code: z.ZodIssueCode.custom, + code: "custom", message: "Email format is invalid", path: ["email"], })