Gyaku (逆, inversion) — a tiny, modern DI container for
TypeScript, built around await using.
Why gyaku?
Unknown deps and duplicate keys are caught at compile time. No
casts, no any.
No decorators, no reflect-metadata. Just plain
TypeScript functions and classes.
Services without shared deps are resolved concurrently along the dependency graph.
await using
using-aware values are automatically disposed in
reverse dependency order.
Factory functions can be written with or without async.
replaceService / replaceValue swap any
dependency.
Quick start
import { createRegistry } from "@gyaku/di";
const createGreeter = ({ name }: { name: string }) => ({
say: () => console.log(`hello, ${name}`),
});
const registry = createRegistry()
.value("name", "gyaku")
.service("greeter", ["name"], createGreeter);
await using services = await registry.resolve();
services.greeter.say();
// hello, gyaku