@vielzeug/conduit
v2.1.0
Published
Lightweight dependency injection container — singletons, transient instances, factories, and named scopes
Readme
@vielzeug/conduit
Typed, dependency-first asynchronous dependency injection for TypeScript.
Install
pnpm add @vielzeug/conduitStart Here
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();Design
- Factory dependency tuples drive resolution and validation.
- Factory results default to singleton lifetime.
- Use
{ lifetime: 'transient' }for a new value per resolution; adddisposeonly when Conduit must own its cleanup. - Use
scope()andcreateScope()for request/job ownership. A singleton cannot depend on a scoped factory. - Disposal aborts
disposalSignal, waits for in-flight factories, and releases dependents before dependencies.
import { createContainer, scope, token } from '@vielzeug/conduit';
const Request = scope('request');
const Session = token<{ id: string }>('Session');
const root = createContainer();
root.factory(Session, [], () => ({ id: crypto.randomUUID() }), { lifetime: Request });
const request = root.createScope(Request);
const session = await request.resolve(Session);
await request.dispose();
await root.dispose();Validation
Validate static dependencies before application startup completes.
container.validate();validate() detects missing registrations and circular factory tuples.
Errors
All errors extend ConduitError. Use ConduitError.is(error) for package-boundary guards.
ConduitErrorConduitProviderNotFoundErrorConduitCircularDependencyErrorConduitScopedResolutionErrorConduitDuplicateRegistrationErrorConduitDisposedErrorConduitDisposeError
Documentation
License
MIT © Helmuth Saatkamp
