1ランタイムに
ランタイムに 縛られない TypeScript アプリケーション
Application、Contract、DI、Taskを一つのGraphとして構築
$
npm create loutre@latest my-appapp.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が動く場所なら、どこでも
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