@gyaku/di

Gyaku (逆, inversion) — a tiny, modern DI container for TypeScript, built around await using.

$ npm install @gyaku/di View on GitHub

Why gyaku?

🔒

Fully type-safe

Unknown deps and duplicate keys are caught at compile time. No casts, no any.

Zero boilerplate

No decorators, no reflect-metadata. Just plain TypeScript functions and classes.

Parallel resolution

Services without shared deps are resolved concurrently along the dependency graph.

🗑️

Auto-cleanup via await using

using-aware values are automatically disposed in reverse dependency order.

🔄

Sync & async factories

Factory functions can be written with or without async.

🧪

Testable by design

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