💉 aquinas
Dependency injection for the modern web
Clean, type-safe dependency inversion using functions and objects instead of classes and decorators.
Why Aquinas?
No Decorators
Works with plain JavaScript. No experimental decorators or reflect-metadata.
Type Safe
Full TypeScript support with automatic type inference.
Agnostic
Works with any framework without any additional setup or headache.
Quick Example
// 1. Define a reference const UserServiceReference = reference<IUserService>("UserService");// 2. Create an injectableconst UserService = injectable(UserServiceReference) .deps({ userRepository: UserRepositoryReference }) .implements(({ userRepository }) => ({ async createUser(data) { return await userRepository.save(data); } }));// 3. Register in a dockconst appDock = dock();appDock.register(UserService);// 4. Resolve and useconst userService = appDock.get(UserServiceReference);
// 1. Define a reference/** * @type {import("aquinas").Reference<IUserService>} */const UserServiceReference = reference("UserService");// 2. Create an injectableconst UserService = injectable(UserServiceReference) .deps({ userRepository: UserRepositoryReference }) .implements(({ userRepository }) => ({ async createUser(data) { return await userRepository.save(data); } }));// 3. Register in a dockconst appDock = dock();appDock.register(UserService);// 4. Resolve and useconst userService = appDock.get(UserServiceReference);
Installation
npm i aquinas
pnpm add aquinas
yarn add aquinas
bun add aquinas