Loutre
1

ランタイムに縛られないTypeScriptアプリケーション

Application、Contract、DI、Taskを一つのGraphとして構築

$npm create loutre@latest my-app
app.ts
1import {2  contract,3  defineApplication,4  defineModule,5  implementation,6} from '@loutrejs/loutre'7import { http } from '@loutrejs/loutre/http'8import { z } from 'zod'9 10const AppContract = contract([11  http({12    hello: {13      method: 'GET',14      path: '/',15      responses: {16        ok: {17          status: 200,18          body: z.object({ message: z.string() }),19        },20      },21      pipeline: [http.controller],22    },23  }),24])25 26const AppController = implementation({27  name: 'AppController',28  contract: AppContract,29  protocol: http,30  factory: () => ({31    async hello(ctx) {32      return ctx.response.ok({33        body: { message: 'Hello from Loutre!' },34      })35    },36  }),37})38 39const AppModule = defineModule(() => ({40  implementations: [AppController],41}))42 43export default defineApplication({44  modules: [AppModule()],45})
2

TypeScriptが動く場所なら、どこでも

Node.js

Bun

Deno

Cloudflare Workers

AWS Lambda

Electron

3

一つのApplication Model

Application、Contract、DI、Taskを一つのGraphで表現します

Contract

Protocolと型を定義

Implementation

Contractと実装を分離

Module & DI

Moduleで依存性を構成

Task

JobやCLIも型安全に定義

Application Graph

依存関係をすべて可視化

4

ApplicationとRuntimeを分離

コードは変えずに、Runtimeだけを切り替えられます

const application = defineApplication({

 modules: [UsersModule(), HealthModule()],

})

export default application

Runtimes

Node.js
Bun
Deno
Cloudflare Workers
AWS Lambda
Electron
5

Application Graph

Loutre Graph APIで、依存関係と構成を可視化

loutre graph modules --entry src/app.ts

AppModule [module:1]

 description: HTTP Application entry module

 imports: (none)

Application
UsersModule
HealthModule
Contract (GET /users)
Contract (GET /health)
6

今すぐ始める

$npm create loutre@latest my-app