mcpField
B
bun-elysia

bun-elysia

github.com/ymc182開発066 回インストール41 週間前に更新
リポジトリ

bun-elysia について

bun-elysiaは、BunとElysia.jsで開発する人向けのリファレンススキルです。プロジェクト作成、フレームワークの機能、Bun API、Fastifyからの移行を扱います。

主な機能

  1. 01BunとElysia.jsのプロジェクト作成
  2. 02ルーティング、ハンドラー、検証
  3. 03ライフサイクルフック、プラグイン、WebSocket
  4. 04BunのデータベースとストレージAPI
  5. 05OpenAPIドキュメントとEden型付きクライアント
  6. 06Fastifyからの移行ガイド

活用シーン

  1. 01Elysiaアプリを作成して開発サーバーを起動
  2. 02APIにルートとリクエスト検証を追加
  3. 03BunのデータベースやRedis APIを利用
  4. 04Fastifyの機能をElysiaへ移行

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/ymc182/bun-elysia-skill --skill bun-elysia

インストール後、Claude Code で/bun-elysiaを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
monorepo.md
references/elysia/
swagger.md
lifecycle.md
core.md
websocket.md
eden.md
validation.md
references/migration/
fastify-advanced.md
fastify-hooks.md
fastify-auth.md
fastify-plugins.md
fastify-basics.md
fastify-validation.md
references/native-apis/
http-server.md
redis.md
s3.md
sql.md

詳細

Bun + Elysia.js 開発

Bun ランタイムと Elysia.js フレームワークで、高性能なフルスタックアプリケーションを構築します。

クイックスタート

Elysia プロジェクトの新規作成
bun create elysia my-app
cd my-app
bun run dev
基本的なサーバー
import { Elysia, t } from "elysia";

const app = new Elysia()
  .get("/", () => "Hello, World!")
  .get("/users/:id", ({ params }) => ({ id: params.id }), {
    params: t.Object({ id: t.Number() })
  })
  .post("/users", ({ body }) => ({ created: body }), {
    body: t.Object({
      name: t.String(),
      email: t.String({ format: "email" })
    })
  })
  .listen(3000);
Bun ネイティブ API を使用する
import { Elysia } from "elysia";
import { sql } from "bun";
import { redis } from "bun";

const app = new Elysia()
  .decorate("sql", sql)
  .decorate("redis", redis)
  .get("/users", async ({ sql }) => {
    return sql`SELECT * FROM users`;
  })
  .get("/cache/:key", async ({ redis, params }) => {
    return redis.get(params.key);
  })
  .listen(3000);

リファレンスナビゲーション

何をしますか?

プロジェクトをセットアップする:

  • ワークスペースを使ったモノレポ → monorepo.md

Bun ネイティブ API を使用する:

Elysia で構築する:

Fastify から移行する:


よく使われるパターン

認証ミドルウェア
import { Elysia } from "elysia";
import { jwt } from "@elysiajs/jwt";

const app = new Elysia()
  .use(jwt({ secret: process.env.JWT_SECRET! }))
  .derive(async ({ headers, jwt }) => {
    const token = headers.authorization?.replace("Bearer ", "");
    const user = token ? await jwt.verify(token) : null;
    return { user };
  })
  .get("/profile", ({ user, error }) => {
    if (!user) return error(401);
    return user;
  });
バリデーション付きデータベース
import { Elysia, t } from "elysia";
import { sql } from "bun";

const app = new Elysia()
  .post("/users", async ({ body }) => {
    const [user] = await sql`
      INSERT INTO users (name, email)
      VALUES (${body.name}, ${body.email})
      RETURNING *
    `;
    return user;
  }, {
    body: t.Object({
      name: t.String({ minLength: 1 }),
      email: t.String({ format: "email" })
    })
  });
ガード付きのグループ化ルート
app.group("/api", (app) =>
  app
    .guard({
      headers: t.Object({
        authorization: t.String()
      }),
      beforeHandle: ({ headers, error }) => {
        if (!isValidToken(headers.authorization)) {
          return error(401);
        }
      }
    }, (app) =>
      app
        .get("/users", getUsers)
        .post("/users", createUser)
    )
);
WebSocket チャット
app.ws("/chat", {
  body: t.Object({
    room: t.String(),
    message: t.String()
  }),
  open(ws) {
    ws.subscribe("general");
  },
  message(ws, { room, message }) {
    ws.publish(room, { from: ws.id, message });
  }
});

主な違い:Fastify と Elysia

FastifyElysia
request.params{ params }
request.query{ query }
request.body{ body }
reply.code(n).send(x)set.status = n; return x
reply.header(k, v)set.headers[k] = v
JSON SchemaTypeBox (t.*)
preHandler hookbeforeHandle
fastify.decorate().decorate()
fastify.register(plugin).use(plugin)

インストール

# Elysia and plugins
bun add elysia @elysiajs/swagger @elysiajs/jwt @elysiajs/cors @elysiajs/static @elysiajs/eden

# Types
bun add -d @types/bun typescript

コメント