|
1 | 1 | import { z } from "zod"; |
| 2 | +import { |
| 3 | + zId, |
| 4 | + zOptionalId, |
| 5 | + zDecimalString, |
| 6 | + zEnum, |
| 7 | + zSlug, |
| 8 | + zSemver, |
| 9 | + zOptionalUrl, |
| 10 | + zStringArray, |
| 11 | +} from "@/utils"; |
2 | 12 | import { browsers, extensionStatus } from "../extensions.schema"; |
3 | 13 |
|
4 | 14 | export const extensionSchema = z.object({ |
5 | | - name: z.string().min(1), |
6 | | - slug: z.string().optional(), |
| 15 | + sellerId: zId("Seller ID"), |
| 16 | + categoryId: zOptionalId("Category ID"), |
7 | 17 |
|
8 | | - sellerId: z.number(), |
9 | | - categoryId: z.number(), |
| 18 | + name: z.string().min(3, "Name must be at least 3 characters"), |
| 19 | + slug: zSlug(), |
10 | 20 |
|
11 | | - description: z.string().min(1), |
12 | | - shortDescription: z.string().optional(), |
| 21 | + description: z.string().min(10, "Description must be at least 10 characters"), |
| 22 | + shortDescription: z.string().max(255).optional(), |
13 | 23 |
|
14 | | - price: z.string().regex(/^\d{1,8}(\.\d{1,2})?$/, "Invalid price format"), |
15 | | - version: z.string().min(1), |
| 24 | + price: zDecimalString(2), |
| 25 | + originalPrice: zDecimalString(2), |
16 | 26 |
|
17 | | - browsers: z.array(z.enum(browsers)).default(["chrome"]), |
18 | | - tags: z.array(z.string()).optional(), |
19 | | - iconUrl: z.url().optional(), |
20 | | - screenshots: z.array(z.string()).optional(), |
21 | | - videoUrl: z.url().optional(), |
22 | | - downloadUrl: z.url().optional(), |
| 27 | + version: zSemver(), |
| 28 | + browsers: z.array(zEnum(browsers, "Browser")).default([]), |
| 29 | + tags: zStringArray(), |
| 30 | + screenshots: zStringArray(), |
23 | 31 |
|
24 | | - downloadCount: z.number().int().nonnegative().default(0), |
25 | | - rating: z |
26 | | - .string() |
27 | | - .regex(/^\d{1}(\.\d{1,2})?$/, "Invalid rating format") |
28 | | - .default("0.00"), |
| 32 | + iconUrl: zOptionalUrl(), |
| 33 | + videoUrl: zOptionalUrl(), |
| 34 | + downloadUrl: zOptionalUrl().optional(), |
29 | 35 |
|
30 | | - reviewCount: z.number().int().nonnegative().optional(), |
31 | | - status: z.enum(extensionStatus).optional(), |
32 | | -}); |
| 36 | + downloadCount: z.number().int().min(0).default(0), |
| 37 | + rating: zDecimalString(2).default("0.00"), |
| 38 | + reviewCount: z.number().int().min(0).default(0), |
33 | 39 |
|
| 40 | + status: zEnum(extensionStatus, "Status").default("draft"), |
| 41 | +}); |
34 | 42 | export type ExtensionSchema = z.infer<typeof extensionSchema>; |
0 commit comments