@katajs-framework/core
v0.4.2
Published
An opinionated, type-safe web framework on Hono — static DI, mandatory Zod input/output schemas, no-codegen RPC, and a verifiable folder layout.
Maintainers
Readme
@katajs-framework/core
A web framework on Hono. Opinionated like NestJS, functional like a script, verifiable like a type system.
Static DI, mandatory input/output schemas, and a locked folder layout — see the ADRs for the full reasoning.
Install
hono and zod are peer dependencies — install them alongside @katajs-framework/core:
pnpm add @katajs-framework/core hono zodUsage
import { defineContext, singleton } from '@katajs-framework/core'
const { defineRoute, createApp } = defineContext({
greeting: singleton('hello'),
})defineContext returns the typed factory (defineMiddleware, defineRoute,
createApp). Every route declares input and output Zod schemas; dependencies
are read through the statically-typed c.get('key').
A route that serves something other than JSON — CSV, plain text, a download —
declares it with raw(contentType, schema) instead of a bare schema; only a
Response satisfies it, and the RPC client below types it with .text():
output: raw('text/csv', z.string())Typed RPC client
createApp returns a parametric Hono app, so Hono's hc client infers paths,
inputs, and responses from your Zod schemas with no codegen. Export the app
type (or name it with the exported KataApp) and consume it from any client:
import { hc } from 'hono/client'
import type { AppType } from './server' // export type AppType = typeof app
const client = hc<AppType>('https://api.example.com')
const res = await client.users.$post({ json: { name: 'Ada', email: '[email protected]' } })
const user = await res.json() // typed from the route's `output` schemaSee examples/hello-client
for a runnable, type-checked walkthrough.
The package ships as ESM with bundled type declarations (dist/index.js +
dist/index.d.ts).
