A lightweight, type-aware dependency injection container for JavaScript/TypeScript (with JSDoc support), supporting class and function dependencies with type inference.
npm install "@collidor/injector"
import { Injector } from '"@collidor/injector"'; // Create injector const injector = new Injector(); // Register a class instance class DatabaseService { connect() { return 'Connected!'; } } injector.register(DatabaseService, new DatabaseService()); // Inject the instance (type inferred as DatabaseService) const db = injector.inject(DatabaseService); console.log(db.connect()); // "Connected!"
// Register a factory function const configFactory = () => ({ env: 'production' }); injector.register(configFactory, configFactory()); // Inject the function result (type inferred as { env: string }) const config = injector.inject(configFactory); console.log(config.env); // "production"
import {Database} from './database.ts' class Service { private database = inject(Database) getData() { return this.database.query(); } }
If two classes depend on each other in any place except the constructor, we can use getters or get the instances directly in the Methods:
import {Database} from './database.ts' class Service { get database(): Database { return inject(Database); } getData() { return this.database.query(); } }
try { injector.inject(UnregisteredService); // Throws error } catch (err) { console.error(err.message); // "No instance registered for type: UnregisteredService" }
Injector
register(type, instance)
type
: Constructor | Function | Symbol | Object (dependency identifier)instance
: Value to storevoid
Registers a dependency instance.
inject(type)
type
: Constructor | Function | Symbol | Object (dependency identifier)T extends Type<infer M> ? M : T extends (...args: any[]) => infer R ? R : any
type
Retrieves a dependency instance.
Works with both class constructors and factory functions:
// Class registration class AuthService { login() { /* ... */ } } injector.register(AuthService, new AuthService()); const auth = injector.inject(AuthService); // Inferred as AuthService // Function registration const loggerFactory = () => ({ log: (msg: string) => console.log(msg) }); injector.register(loggerFactory, loggerFactory()); const logger = injector.inject(loggerFactory); // Inferred as { log: (msg: string) => void }
MIT
Add Package
deno add jsr:@collidor/injector
Import symbol
import * as injector from "@collidor/injector";
---- OR ----
Import directly with a jsr specifier
import * as injector from "jsr:@collidor/injector";
Add Package
npx jsr add @collidor/injector
Import symbol
import * as injector from "@collidor/injector";
Add Package
yarn dlx jsr add @collidor/injector
Import symbol
import * as injector from "@collidor/injector";
Add Package
pnpm dlx jsr add @collidor/injector
Import symbol
import * as injector from "@collidor/injector";
Add Package
bunx jsr add @collidor/injector
Import symbol
import * as injector from "@collidor/injector";