|
| 1 | +import { z } from "zod" |
| 2 | + |
| 3 | +/** |
| 4 | + * Schema for MCP parameter definitions |
| 5 | + */ |
| 6 | +export const mcpParameterSchema = z.object({ |
| 7 | + name: z.string().min(1), |
| 8 | + key: z.string().min(1), |
| 9 | + placeholder: z.string().optional(), |
| 10 | + optional: z.boolean().optional().default(false), |
| 11 | +}) |
| 12 | + |
| 13 | +export type McpParameter = z.infer<typeof mcpParameterSchema> |
| 14 | + |
| 15 | +/** |
| 16 | + * Schema for MCP installation method with name |
| 17 | + */ |
| 18 | +export const mcpInstallationMethodSchema = z.object({ |
| 19 | + name: z.string().min(1), |
| 20 | + content: z.string().min(1), |
| 21 | + parameters: z.array(mcpParameterSchema).optional(), |
| 22 | + prerequisites: z.array(z.string()).optional(), |
| 23 | +}) |
| 24 | + |
| 25 | +export type McpInstallationMethod = z.infer<typeof mcpInstallationMethodSchema> |
| 26 | + |
| 27 | +/** |
| 28 | + * Component type validation |
| 29 | + */ |
| 30 | +export const marketplaceItemTypeSchema = z.enum(["mode", "mcp"] as const) |
| 31 | + |
| 32 | +export type MarketplaceItemType = z.infer<typeof marketplaceItemTypeSchema> |
| 33 | + |
| 34 | +/** |
| 35 | + * Base schema for common marketplace item fields |
| 36 | + */ |
| 37 | +const baseMarketplaceItemSchema = z.object({ |
| 38 | + id: z.string().min(1), |
| 39 | + name: z.string().min(1, "Name is required"), |
| 40 | + description: z.string(), |
| 41 | + author: z.string().optional(), |
| 42 | + authorUrl: z.string().url("Author URL must be a valid URL").optional(), |
| 43 | + tags: z.array(z.string()).optional(), |
| 44 | + prerequisites: z.array(z.string()).optional(), |
| 45 | +}) |
| 46 | + |
| 47 | +/** |
| 48 | + * Type-specific schemas for YAML parsing (without type field, added programmatically) |
| 49 | + */ |
| 50 | +export const modeMarketplaceItemSchema = baseMarketplaceItemSchema.extend({ |
| 51 | + content: z.string().min(1), // YAML content for modes |
| 52 | +}) |
| 53 | + |
| 54 | +export type ModeMarketplaceItem = z.infer<typeof modeMarketplaceItemSchema> |
| 55 | + |
| 56 | +export const mcpMarketplaceItemSchema = baseMarketplaceItemSchema.extend({ |
| 57 | + url: z.string().url(), // Required url field |
| 58 | + content: z.union([z.string().min(1), z.array(mcpInstallationMethodSchema)]), // Single config or array of methods |
| 59 | + parameters: z.array(mcpParameterSchema).optional(), |
| 60 | +}) |
| 61 | + |
| 62 | +export type McpMarketplaceItem = z.infer<typeof mcpMarketplaceItemSchema> |
| 63 | + |
| 64 | +/** |
| 65 | + * Unified marketplace item schema using discriminated union |
| 66 | + */ |
| 67 | +export const marketplaceItemSchema = z.discriminatedUnion("type", [ |
| 68 | + // Mode marketplace item |
| 69 | + modeMarketplaceItemSchema.extend({ |
| 70 | + type: z.literal("mode"), |
| 71 | + }), |
| 72 | + // MCP marketplace item |
| 73 | + mcpMarketplaceItemSchema.extend({ |
| 74 | + type: z.literal("mcp"), |
| 75 | + }), |
| 76 | +]) |
| 77 | + |
| 78 | +export type MarketplaceItem = z.infer<typeof marketplaceItemSchema> |
| 79 | + |
| 80 | +/** |
| 81 | + * Installation options for marketplace items |
| 82 | + */ |
| 83 | +export const installMarketplaceItemOptionsSchema = z.object({ |
| 84 | + target: z.enum(["global", "project"]).optional().default("project"), |
| 85 | + parameters: z.record(z.string(), z.any()).optional(), |
| 86 | +}) |
| 87 | + |
| 88 | +export type InstallMarketplaceItemOptions = z.infer<typeof installMarketplaceItemOptionsSchema> |
0 commit comments