40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import { z } from "zod";
|
|
|
|
export const EntityIdSchema = z.string().regex(/^[a-z]+_[a-zA-Z0-9_-]+$/);
|
|
export const AttachmentIdSchema = z.string().regex(/^att_[a-zA-Z0-9_-]+$/);
|
|
|
|
export const MessageInputSchema = z.object({
|
|
text: z.string().max(100_000).default(""),
|
|
attachmentIds: z.array(AttachmentIdSchema).max(4).default([]),
|
|
}).strict().superRefine((value, context) => {
|
|
if (value.text.trim().length === 0 && value.attachmentIds.length === 0) {
|
|
context.addIssue({
|
|
code: "custom",
|
|
path: ["text"],
|
|
message: "A message requires text or at least one attachment",
|
|
});
|
|
}
|
|
|
|
if (new Set(value.attachmentIds).size !== value.attachmentIds.length) {
|
|
context.addIssue({
|
|
code: "custom",
|
|
path: ["attachmentIds"],
|
|
message: "Attachment IDs must be unique",
|
|
});
|
|
}
|
|
});
|
|
|
|
export const ImageAttachmentSchema = z.object({
|
|
attachmentId: AttachmentIdSchema,
|
|
sessionId: z.string().regex(/^ses_[a-zA-Z0-9_-]+$/),
|
|
name: z.string().trim().min(1).max(255),
|
|
mediaType: z.enum(["image/jpeg", "image/png", "image/webp"]),
|
|
byteSize: z.int().positive(),
|
|
width: z.int().positive(),
|
|
height: z.int().positive(),
|
|
status: z.literal("ready"),
|
|
}).strict();
|
|
|
|
export type MessageInput = z.infer<typeof MessageInputSchema>;
|
|
export type ImageAttachment = z.infer<typeof ImageAttachmentSchema>;
|