Loading...
Loading...
Create backend with ElysiaJS, a type-safe, high-performance framework.
npx skill4agent add elysiajs/skills elysiajsbun create elysia appimport { Elysia, t, status } from 'elysia'
const app = new Elysia()
.get('/', () => 'Hello World')
.post('/user', ({ body }) => body, {
body: t.Object({
name: t.String(),
age: t.Number()
})
})
.get('/id/:id', ({ params: { id } }) => {
if(id > 1_000_000) return status(404, 'Not Found')
return id
}, {
params: t.Object({
id: t.Number({
minimum: 1
})
}),
response: {
200: t.Number(),
404: t.Literal('Not Found')
}
})
.listen(3000)import { Elysia } from 'elysia'
new Elysia()
.get('/', 'GET')
.post('/', 'POST')
.put('/', 'PUT')
.patch('/', 'PATCH')
.delete('/', 'DELETE')
.options('/', 'OPTIONS')
.head('/', 'HEAD').get('/user/:id', ({ params: { id } }) => id)
.get('/post/:id/:slug', ({ params }) => params).get('/search', ({ query }) => query.q)
// GET /search?q=elysia → "elysia".post('/user', ({ body }) => body).get('/', ({ headers }) => headers.authorization)import { Elysia, t } from 'elysia'
.post('/user', ({ body }) => body, {
body: t.Object({
name: t.String(),
age: t.Number(),
email: t.String({ format: 'email' }),
website: t.Optional(t.String({ format: 'uri' }))
})
})body: t.Object({
user: t.Object({
name: t.String(),
address: t.Object({
street: t.String(),
city: t.String()
})
})
})body: t.Object({
tags: t.Array(t.String()),
users: t.Array(t.Object({
id: t.String(),
name: t.String()
}))
}).post('/upload', ({ body }) => body.file, {
body: t.Object({
file: t.File({
type: 'image', // image/* mime types
maxSize: '5m' // 5 megabytes
}),
files: t.Files({ // Multiple files
type: ['image/png', 'image/jpeg']
})
})
}).get('/user/:id', ({ params: { id } }) => ({
id,
name: 'John',
email: 'john@example.com'
}), {
params: t.Object({
id: t.Number()
}),
response: {
200: t.Object({
id: t.Number(),
name: t.String(),
email: t.String()
}),
404: t.String()
}
})import { z } from 'zod'
.post('/user', ({ body }) => body, {
body: z.object({
name: z.string(),
age: z.number().min(0),
email: z.string().email()
})
}).get('/user/:id', ({ params: { id }, status }) => {
const user = findUser(id)
if (!user) {
return status(404, 'User not found')
}
return user
}).guard({
params: t.Object({
id: t.Number()
})
}, app => app
.get('/user/:id', ({ params: { id } }) => id)
.delete('/user/:id', ({ params: { id } }) => id)
).macro({
hi: (word: string) => ({
beforeHandle() { console.log(word) }
})
})
.get('/', () => 'hi', { hi: 'Elysia' })src/
├── index.ts # Main server entry
├── modules/
│ ├── auth/
│ │ ├── index.ts # Auth routes (Elysia instance)
│ │ ├── service.ts # Business logic
│ │ └── model.ts # TypeBox schemas/DTOs
│ └── user/
│ ├── index.ts
│ ├── service.ts
│ └── model.ts
└── plugins/
└── custom.ts
public/ # Static files (if using static plugin)
test/ # Unit testsonErrorElysia.models({ ...models })Model.nameModelstatusimport { status } from 'elysia'return Errorthrow Errorlocalscopedglobal.onBeforeHandle(() => {}) // only local instance
.onBeforeHandle({ as: 'global' }, () => {}) // exports to allconst app = new Elysia()
app.state('build', 1) // loses type
app.get('/', ({ store }) => store.build) // build doesn't existsnew Elysia()
.state('build', 1)
.get('/', ({ store }) => store.build)const auth = new Elysia()
.decorate('Auth', Auth)
.model(Auth.models)
new Elysia()
.get('/', ({ Auth }) => Auth.getProfile()) // Auth doesn't exists
new Elysia()
.use(auth) // must declare
.get('/', ({ Auth }) => Auth.getProfile())new Elysia() // rerun on `.use`
new Elysia({ name: 'ip' }) // runs once across all instances.onBeforeHandle(() => console.log('1'))
.get('/', () => 'hi') // has hook
.onBeforeHandle(() => console.log('2')) // doesn't affect '/'.post('/', ({ body }) => Controller.greet(body), {
body: t.Object({ name: t.String() })
})type MyType = typeof MyType.staticnew Elysia()
.model({
book: t.Object({
name: t.String()
})
})
.post('/', ({ body }) => body.name, {
body: 'book'
}).prefix.suffixnew Elysia()
.model({
book: t.Object({
name: t.String()
})
})
.prefix('model', 'Namespace')
.post('/', ({ body }) => body.name, {
body: 'Namespace.Book'
})prefixOpenAPI Type GenfromTypes@elysiajs/openapiplugins/openapi.mdEdenEden Treatyroute.mdplugin.mdvalidation.mdbun-fullstack-dev-server.mdcookie.mddeployment.mdeden.mdguard.mdmacro.mdplugin.mdroute.mdtesting.mdvalidation.mdwebsocket.mdbearer.md@elysiajs/bearercors.md@elysiajs/corscron.md@elysiajs/crongraphql-apollo.md@elysiajs/graphql-apollographql-yoga.md@elysiajs/graphql-yogahtml.md@elysiajs/htmljwt.md@elysiajs/jwtopenapi.md@elysiajs/openapiopentelemetry.md@elysiajs/opentelemetryserver-timing.md@elysiajs/server-timingstatic.md@elysiajs/staticai-sdk.mdastro.mdbetter-auth.mdcloudflare-worker.mddeno.mddrizzle.mdexpo.mdnextjs.mdnodejs.mdnuxt.mdprisma.mdreact-email.dsveltekit.mdtanstack-start.mdvercel.mdbasic.tsbody-parser.ts.onParsecomplex.tscookie.tserror.tsfile.tsguard.tsmap-response.tsredirect.tsrename.tsschema.tsstate.tsupload-file.tswebsocket.tspatterns/mvc.md