💉 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

Get Started →