diff --git a/src/lib/AGENTS.md b/src/lib/AGENTS.md index 9907e90..8662a22 100644 --- a/src/lib/AGENTS.md +++ b/src/lib/AGENTS.md @@ -12,7 +12,7 @@ Shared utilities and infrastructure layers used across the application. **Purpose**: Input validation and type safety using Zod schemas -- `ProjectInputSchema`: Project data validation (1-10 tags, 1-10 links) +- `ProjectInputSchema`: Project data validation (1+ tags, 1-10 links) - `WebhookPayloadSchema`: Webhook request validation with API key auth - `KeywordInputSchema`: Keyword cloud data with visual config - `ProjectQuerySchema`: Query parameter validation (search, tags, status, pagination) diff --git a/src/lib/validations.test.ts b/src/lib/validations.test.ts index 78f7607..90f505b 100644 --- a/src/lib/validations.test.ts +++ b/src/lib/validations.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { AIEventInputSchema } from './validations'; +import { AIEventInputSchema, ProjectInputSchema } from './validations'; describe('AIEventInputSchema', () => { const validEvent = { @@ -62,3 +62,34 @@ describe('AIEventInputSchema', () => { })).toThrow(); }); }); + +describe('ProjectInputSchema', () => { + const baseProjectInput = { + name: 'Agent Park', + description: 'A curated list of practical AI agent tools.', + tags: [{ name: 'ai-agent' }], + links: [{ type: 'GITHUB' as const, url: 'https://github.com/example/repo' }], + }; + + it('should allow more than 10 tags', () => { + const manyTags = Array.from({ length: 20 }, (_, index) => ({ + name: `tag-${index + 1}`, + })); + + expect(() => + ProjectInputSchema.parse({ + ...baseProjectInput, + tags: manyTags, + }) + ).not.toThrow(); + }); + + it('should still require at least one tag', () => { + expect(() => + ProjectInputSchema.parse({ + ...baseProjectInput, + tags: [], + }) + ).toThrow(); + }); +}); diff --git a/src/lib/validations.ts b/src/lib/validations.ts index 27ecb4c..6c251c5 100644 --- a/src/lib/validations.ts +++ b/src/lib/validations.ts @@ -49,7 +49,7 @@ export const ProjectBaseSchema = z.object({ }); export const ProjectInputSchema = ProjectBaseSchema.extend({ - tags: z.array(TagSchema).min(1, "At least one tag is required").max(10), + tags: z.array(TagSchema).min(1, "At least one tag is required"), links: z.array(ExternalLinkSchema).min(1, "At least one link is required").max(10), });