--- name: repo-structure-navigate description: Navigate the Valibot repository structure. Use when looking for files, understanding the codebase layout, finding schema/action/method implementations, locating tests, API docs, or guide pages. Covers monorepo layout, library architecture, file naming conventions, and quick lookups. --- # Valibot Repository Structure ## Monorepo Layout ``` valibot/ ├── library/ # Core valibot package (zero dependencies) ├── packages/ │ ├── i18n/ # Translated error messages (25+ languages) │ └── to-json-schema/ # JSON Schema converter ├── codemod/ │ ├── migrate-to-v0.31.0/ # Version migration │ └── zod-to-valibot/ # Zod converter ├── website/ # valibot.dev (Qwik + Vite) ├── brand/ # Brand assets ├── skills/ # Agent skills (this folder) └── prompts/ # Legacy AI agent guides ``` ## Core Library (`/library/src/`) ### Directory Structure | Directory | Purpose | Examples | | ----------- | ------------------------------- | --------------------------------------------- | | `schemas/` | Data type validators | `string/`, `object/`, `array/`, `union/` | | `actions/` | Validation & transformation | `email/`, `minLength/`, `trim/`, `transform/` | | `methods/` | High-level API | `parse/`, `safeParse/`, `pipe/`, `partial/` | | `types/` | TypeScript definitions | `schema.ts`, `issue.ts`, `dataset.ts` | | `utils/` | Internal helpers (prefixed `_`) | `_addIssue/`, `_stringify/`, `ValiError/` | | `storages/` | Global state | Config, message storage | ### Schema Categories - **Primitives**: `string`, `number`, `boolean`, `bigint`, `date`, `symbol`, `blob`, `file` - **Objects**: `object`, `strictObject`, `looseObject`, `objectWithRest` - **Arrays**: `array`, `tuple`, `strictTuple`, `looseTuple`, `tupleWithRest` - **Advanced**: `union`, `variant`, `intersect`, `record`, `map`, `set`, `lazy`, `custom` - **Modifiers**: `optional`, `nullable`, `nullish`, `nonNullable`, `nonNullish`, `nonOptional` ### Action Types **Validation** (return issues): `email`, `url`, `uuid`, `regex`, `minLength`, `maxValue`, `check` **Transformation** (modify data): `trim`, `toLowerCase`, `toUpperCase`, `mapItems`, `transform` **Metadata**: `brand`, `flavor`, `metadata`, `description`, `title` ### File Naming Convention Each schema/action/method has its own directory: ``` schemas/string/ ├── string.ts # Implementation ├── string.test.ts # Runtime tests ├── string.test-d.ts # Type tests └── index.ts # Re-export ``` ### Core Patterns **Schemas** define data types: ```typescript export interface StringSchema extends BaseSchema<...> { readonly kind: 'schema'; readonly type: 'string'; // ... } ``` **Actions** validate/transform in pipelines: ```typescript export interface EmailAction extends BaseValidation<...> { readonly kind: 'validation'; readonly type: 'email'; // ... } ``` **Methods** provide API functions: ```typescript export function parse( schema: TSchema, input: unknown ): InferOutput; ``` ### Key Types - `BaseSchema`, `BaseValidation`, `BaseTransformation` - Base interfaces - `InferOutput`, `InferInput`, `InferIssue` - Type inference - `Config`, `ErrorMessage`, `BaseIssue` - Configuration and errors - `'~standard'` property - [Standard Schema](https://github.com/standard-schema/standard-schema) compatibility ## Website (`/website/src/routes/`) ### API Documentation ``` routes/api/ ├── (schemas)/string/ # Schema docs │ ├── index.mdx # MDX content │ └── properties.ts # Type definitions ├── (actions)/email/ # Action docs ├── (methods)/parse/ # Method docs ├── (types)/StringSchema/ # Type docs └── menu.md # Navigation ``` ### Guides ``` routes/guides/ ├── (get-started)/ # Intro, installation ├── (main-concepts)/ # Schemas, pipelines, parsing ├── (schemas)/ # Objects, arrays, unions ├── (advanced)/ # Async, i18n, JSON Schema ├── (migration)/ # Version upgrades └── menu.md # Navigation ``` ## Development ### Playground Use `library/playground.ts` for quick experimentation. ### Adding a Schema/Action 1. Create directory: `library/src/schemas/yourSchema/` 2. Create files: `yourSchema.ts`, `yourSchema.test.ts`, `yourSchema.test-d.ts`, `index.ts` 3. Follow existing patterns (copy similar implementation) 4. Export from category `index.ts` 5. Run `pnpm -C library test` ### Modifying Core Types ⚠️ Changes to `library/src/types/` affect the entire library. Always run full test suite. ## Quick Lookups | Looking for... | Location | | --------------------- | ---------------------------------------------- | | Schema implementation | `library/src/schemas/[name]/[name].ts` | | Action implementation | `library/src/actions/[name]/[name].ts` | | Method implementation | `library/src/methods/[name]/[name].ts` | | Type definitions | `library/src/types/` | | Internal utilities | `library/src/utils/` | | Error messages (i18n) | `packages/i18n/[lang]/` | | API docs page | `website/src/routes/api/(category)/[name]/` | | Guide page | `website/src/routes/guides/(category)/[name]/` | | Tests | Same directory as source, `.test.ts` suffix | | Type tests | Same directory as source, `.test-d.ts` suffix | ## Commands ```bash # Library pnpm -C library build # Build pnpm -C library test # Run tests pnpm -C library lint # Lint pnpm -C library format # Format # Website pnpm -C website dev # Dev server pnpm -C website build # Production build # Root pnpm install # Install all pnpm format # Format all ``` ## Key Principles 1. **Modularity** - Small, focused functions; one per file 2. **Zero dependencies** - Core library has no runtime deps 3. **100% test coverage** - Required for library 4. **Tree-shakable** - Use `// @__NO_SIDE_EFFECTS__` annotation 5. **Type-safe** - Full TypeScript with strict mode 6. **ESM only** - Imports include `.ts` extensions ## Do's and Don'ts **Do:** - Follow existing code patterns - Write runtime and type tests - Add JSDoc documentation - Keep functions small and focused - Check bundle size impact **Don't:** - Add external dependencies - Modify core types without full test run - Skip tests - Create large multi-purpose functions - Modify generated files (`dist/`, `coverage/`)