UNPKG

conteneur

Version:

TypeScript Inversion of Control container for Dependency Injection.

98 lines (66 loc) โ€ข 3.44 kB
# ConteneurJS [![npm](https://img.shields.io/npm/v/conteneur.svg?maxAge=1000)](https://www.npmjs.com/package/conteneur) [![npm](https://img.shields.io/npm/dt/conteneur.svg?maxAge=1000)](https://www.npmjs.com/package/conteneur) [![CI](https://github.com/QuentinDutot/conteneur/actions/workflows/ci.yml/badge.svg)](https://github.com/QuentinDutot/conteneur/actions/workflows/ci.yml) TypeScript **Inversion of Control** container for **Dependency Injection**. It supports **Functions and Classes**, **Scoped Containers**, **Transient and Singleton Strategies**, and **Cyclic Dependency Detection**. - ๐Ÿชถ 0.9KB minified - ๐Ÿงฉ Zero dependencies - ๐Ÿ“ฆ TypeScript and ESM - ๐Ÿงช 100% Test Coverage - ๐ŸŒ Runtime Agnostic (Browser, Node, Deno, Bun, AWS, Vercel, Cloudflare, ..) ## ๐Ÿš€ Usage ```js import { createContainer } from 'conteneur' const container = createContainer() container.register({ dataService: [createDataService], reportService: [createReportService], }) const reportService = container.resolve('reportService') reportService.getReport() // Report: data from DataService ``` Full TypeScript example with resolution, injection, scoping: [docs/typescript-example.md](./docs/typescript-example.md) ## ๐Ÿ”‹ APIs Creates a new container. ```js createContainer(options?: ContainerOptions): Container ``` `options.defaultStrategy` : *transient* (default) - *singleton* ### register Registers multiple resolvers within the container. ```js container.register(entries: ResolverEntries): void ``` `options.strategy` : *transient* (default) - *singleton* ### resolve Injects a function or a class **registered** in the container with its dependencies and returns the result. ```js container.resolve<Key extends keyof Container>(key: Key): Container[Key] ``` ### inject Injects a function or a class **not registered** in the container with its dependencies and returns the result. ```js container.inject<T>(target: FunctionFactory<T>): T ``` ### createScope Creates a new scope within the container. ```js container.createScope(): void ``` ## ๐Ÿ“Š Comparisons | | ConteneurJS | InversifyJS | TSyringe | TypeDI | Awilix | |---------------------|-------------|-------------|-----------|----------|-----------| | TS + ESM + Tests | โœ… | โœ… | โœ… | โœ… | โœ… | | Dependency Count | ๐Ÿฅ‡ 0 | ๐Ÿฅˆ 1 | ๐Ÿฅˆ 1 | ๐Ÿฅ‡ 0 | ๐Ÿฅ‰ 2 | | Runtime Agnostic | โœ… | โŒ | โŒ | โŒ | โŒ | | Function Support | โœ… | โŒ | โŒ | โŒ | โœ… | | Class Support | โœ… | โœ… | โœ… | โœ… | โœ… | | Value Support | โœ… | โŒ | โŒ | โŒ | โœ… | | Decorator Free | โœ… | โŒ | โŒ | โŒ | โœ… | | Lifetime Management | โœ… | โœ… | โœ… | โœ… | โœ… | | Scoped Container | โœ… | โœ… | โœ… | โŒ | โœ… | | Size (min) | ๐Ÿฅ‡ 1.1kb | โž– 49.9kb | โž– 15.6kb | ๐Ÿฅˆ 9.5kb | ๐Ÿฅ‰ 12.5kb | | Size (min + gzip) | ๐Ÿฅ‡ 0.6kb | โž– 11.1kb | โž– 4.7kb | ๐Ÿฅˆ 2.7kb | ๐Ÿฅ‰ 4.6kb | ## ๐Ÿ“ƒ Inspiration This project was inspired by [jeffijoe/awilix](https://github.com/jeffijoe/awilix) and builds upon its core concepts.