Version v2.0.1 Size 1.7 KB gzip Dependencies Zero dependencies
Why Conduit?
Conduit makes service wiring explicit. Factory dependency tuples are source of truth for creation, startup validation, and disposal order.
ts
// Before
const service = createService(createApi(config), logger);
// After
container.factory(Service, [Api, Logger], (api, logger) => createService(api, logger));| Feature | Conduit | Inversify | tsyringe |
|---|---|---|---|
| Dependencies | Explicit token tuples | Decorators/runtime metadata | Decorators/runtime metadata |
| Async factories | Partial | Partial | |
| Lifecycle scopes | |||
| Runtime dependencies | 0 |
Use Conduit when application services need explicit wiring and owned lifecycle cleanup.
Consider direct imports when dependencies are static, small, and need no replacement or disposal boundary.
Installation
sh
pnpm add @vielzeug/conduitsh
npm install @vielzeug/conduitsh
yarn add @vielzeug/conduitQuick Start
ts
import { createContainer, token } from '@vielzeug/conduit';
const Config = token<{ baseUrl: string }>('Config');
const Client = token<{ url: string }>('Client');
const container = createContainer();
container.value(Config, { baseUrl: '/api' });
container.factory(Client, [Config], (config) => ({ url: `${config.baseUrl}/users` }));
console.log(await container.resolve(Client));
await container.dispose();Features
token: typed dependency identityfactory: static dependency-first creationvalidate: startup graph validationscope: explicit request and job ownershipdispose: in-flight-safe resource cleanup