mcpField
E
elysiajs

elysiajs

github.com/elysiajsDevelopment6814.2k installsUpdated 1w ago
Repository

About elysiajs

A development skill that guides work on Elysia v2 projects, including version-aware API use, typing, validation, and testing. It helps developers follow the project's existing conventions and consult focused references for the task at hand.

Key features

  1. 01Check versions and project conventions
  2. 02Apply Elysia routing and lifecycle rules
  3. 03Use schemas and inferred types
  4. 04Compose plugins and typed dependencies
  5. 05Test routes and run type checks

Use cases

  1. 01Implement or modify an Elysia v2 route
  2. 02Diagnose validation and error handling behavior
  3. 03Test a route and check inferred types

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/elysiajs/skills --skill elysiajs

After installing, type/elysiajsin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

metadata.json
references/
ai-sdk.md
api.md
better-auth.md
cheat-sheet.md
composition.md
cookie.md
deploy.md
drizzle.md
eden.md
errors.md
lifecycle.md
migration.md
observability.md
openapi.md
plugins.md
prisma.md
project-structure.md
react-email.md
runtimes.md
testing.md
validation.md
versions.md
websocket.md

Details

From the project README

Elysia v2

Start here

  1. Inspect package.json, the lockfile, runtime, and app structure. Keep existing versions and conventions unless the user requests a migration.
  2. This skill describes 2.0.0-rc.0 or newer. For v1, use migration to recognize differences, not as permission to upgrade. Check installed types when a different beta disagrees.
  3. Read only the references the task needs. Versions lists the source revision, package baselines, and verification limits.
  4. Check types and exercise the affected route, including its rejection path. See testing.

Essential rules

  • Options precede the handler. .get(path, options, handler), .get(path, handler), and .get(path, staticValue) are valid.
  • Keep the returned type. Chain calls or bind the result to a new variable. Reassigning let app = new Elysia() does not widen its inferred type.
  • Order hooks before routes. Parent hooks before .use(child) reach the child's routes. onRequest runs before routing and is the exception to registration order. See lifecycle.
  • Declare typed dependencies. Each independently defined instance should .use() its providers. Parent runtime inheritance does not give a child those static types. See composition.
  • Name shared plugins. name and seed deduplicate hooks. Plugin factories still execute on each call.
  • Return expected failures. status() and problem() send ordinary responses. A returned Error enters error hooks and contributes to the route's return type. Thrown errors are absent from that inferred type. Explicit error details can remain public in production. See errors.
  • Infer types from schemas. Use UnwrapSchema or UnwrapModels. TypeBox 1.x has no schema .static. Keep handlers inline and pass plain values to services.
  • Choose context lifetime. decorate and state are shared. derive runs per request after validation, in the beforeHandle queue.
  • Guard schemas override by default. A route replaces the corresponding inherited schema. Use schema: 'merge' on the guard when both must apply.
  • Register optional capabilities. File MIME validation needs a detector. WebSockets need elysia/websocket. Node needs @elysia/node and Node 22.18 or newer.
  • Always consult with an actual documentation for the latest features, examples, and references. The skill is a guide to the documentation, not a replacement.

For Elysia 1 use: https://elysiajs.com/llms.txt For Elysia 2 use: https://next.elysiajs.com/llms.txt

Minimal app and test

Use the project's test runner. This Bun example opens no port.

// src/app.ts
import { Elysia, t } from 'elysia'

export const app = new Elysia()
	.get('/users/:id', {
		params: t.Object({ id: t.Number() })
	}, ({ params }) => ({ id: params.id }))

export type App = typeof app
// test/app.test.ts
import { expect, test } from 'bun:test'
import { app } from '../src/app'

test('coerces the id and rejects nonnumeric input', async () => {
	const response = await app.handle('/users/42')
	expect(response.status).toBe(200)
	expect(await response.json()).toEqual({ id: 42 })
	expect((await app.handle('/users/nope')).status).toBe(422)
})

Run bun test and the project's type check. For new projects, see runtime setup. Keep .listen() in the process entry. See project structure.

Choose a reference

TaskRead
Versions, peer dependencies, source versus docsVersions
Configuration, routing, context, files, streamsCore API
Hooks, parsing, derived context, disposalLifecycle
Plugins, hook scope, guards, macrosComposition
Schemas, coercion, uploads, inferred typesValidation
Expected errors, exception mapping, production responsesErrors
Folders, services, models, dependency injectionProject structure
Cookie values, validation, signingCookies
WebSocket routesWebSockets
Route tests, type checks, lazy pluginsTesting
Typed client callsEden
OpenAPI schemas and documentationOpenAPI
Bun, Node, Deno, Workers, frontend framework integrationRuntimes
Bundles, AOT, binaries, Docker, deploymentDeployment
Traces, spans, request timingObservability
CORS, JWT, static files, cron, HTML, GraphQLOfficial plugins
Databases and external librariesDrizzle, Prisma, Better Auth, AI SDK, React Email
v1 syntax and migrationMigration
Find an example by patternPattern index

Defaults for a new project

Default to Bun and t schemas. Keep small apps in one file; split by feature as needed. Add Eden for typed clients and OpenAPI for API documentation.

Comments

Markdown supported