/featherioc

A tiny Inversion-of-Control Container for JS/TS (ES6+).

Primary LanguageTypeScriptMIT LicenseMIT

featherioc

GitHub Workflow Status Codecov npm bundle size

A tiny (~2 KB) Inversion-of-Control Container for JS/TS.

About

What's this exactly?

featherioc is an Inversion-of-Control (IoC) container. It allows you to easily build a dependency graph for your application and inject dependencies where needed. Using an IoC container enforces various SOLID principles and decouples your application, which is critical if you want your application to be testable and modular.

Why do we need yet another IoC container library?

For Node-powered apps, InversifyJS and TSyringe among other libraries often do the job well enough. This library, however, fills the gap in the frontend development world. featherioc does not rely on the reflect-metadata polyfill and does not use decorators for service definitions.

No decorators? How come?

There are two reasons for this. The main reason for not having decorators is because that would otherwise break compatibility with ESBuild (see this issue) and thus, would break compatibility with Vite.

Another reason for not having decorators is because they tend to clutter the codebase quite fast; coworkers/others who have little to no experience with IoC may struggle with decorators such as @injectable in codebases they're working on because they don't know what it means. featherioc leaves your classes as-is, which is a huge plus if you ask me.

What's already supported?

  • Container registry
  • Binding services
  • Binding multiple services at the same time
  • Scopes (Transient and Singleton)
  • useClass provider for services
  • useValue provider for services
  • useFunction provider for services
  • Resolving services by token
  • Use Symbols as tokens
  • Constructor injection

What are you planning on supporting?

  • More stuff I can't think of at the moment

What are you *not* planning on supporting?

  • Property injection
  • Decorators

Examples

See this document.

Author

Kees van Voorthuizen

License

MIT