npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@arhiptsev/dependency-injection

v0.1.0

Published

Dependency Injection package for Type Script apps

Readme

Механизм инжектирования зависимостей для TypeScript приложений

Идея данной либы позаимствована из Angular, и ощутимо упрощена.

Поддерживаются два основных типа зависимотей

  1. Инстанцируемые - классы, инстансы которых будут созданы при инжектировании (один раз, либо при каждом инжектировании если указан singleton: false)
  2. Не инстанцируемые - ими могут являться любые типы данных.

Все зависимости регистрируются в IoC контейнере, и доступны в его пределах, включая сам инстанс контейнера из которого так же можно вытащить любую зависимость.

Для инжектирования зависимостей в конструктор без без явного указания токена через декоратор Inject, к классу должен быть применен декоратор Injectable, в таком случае для инстанцируемой зависимости достаточно будет указать класс в качестве ее типа.

Послед создания контейнера требуется зарегистрировать зависимости (провайдеры) с помощью метода provideDependency, который принимает три типа провайдеров.

@Injectable()
class ClassDependency {}

@Injectable()
class TestClass {
  constructor(
      public dependency: ClassDependency
    ) {}
}

const container = new Container();
container.provideDependencies([ClassDependency, TestClass]);

const testClassInstance = container.getDependency<TestClass>(TestClass);

expect(testClassInstance.dependency).toBeInstanceOf(ClassDependency);

Для каждой зависимости требуется инжектирующий токен, под которым она будет зарегистрирована и доступна для инжектирования. В случае передачи провайдера как функции (класса), в качестве токена и зависимости будет использован сам класс. Так же мы можем передать обьект, в котором можно отдельно указать токен, зависимость и если это класс, указать должен ли он быть синглтоном.

const INJECTION_TOKEN = Symbol();

@Injectable()
class ClassDependency {}

@Injectable()
class TestClass {
  constructor(
    @Inject(INJECTION_TOKEN) public dependency: ClassDependency
  ) {}
}

const container = new Container();
container.provideDependencies([
  { token: INJECTION_TOKEN, useClass: ClassDependency },
  TestClass,
]);

const testClassInstance = container.getDependency<TestClass>(TestClass);

expect(testClassInstance.dependency).toBeInstanceOf(ClassDependency);

Пример провайдинга и инжектирования не синглтонных зависимостей:

const INJECTION_TOKEN = Symbol();

@Injectable()
class ClassDependency {}

@Injectable()
class TestClass {
  constructor(
    @Inject(INJECTION_TOKEN) public dependency1: ClassDependency,
    @Inject(INJECTION_TOKEN) public dependency2: ClassDependency,
  ) {}
}

const container = new Container();
container.provideDependencies([
  { token: INJECTION_TOKEN, useClass: ClassDependency, singleton: false },
  TestClass,
]);

const testClassInstance = container.getDependency<TestClass>(TestClass);

expect(testClassInstance.dependency1).not.toBe(
  testClassInstance.dependency2
);

Пример провайдинга и инжектирования произвольных типов данных, в провайдере передается функция возвращаемое значение которой, будет заинжектировано:

const INJECTION_TOKEN = Symbol();

@Injectable()
class TestClass {
  constructor(@Inject(INJECTION_TOKEN) public dependency: string) {}
}

const container = new Container();
container.provideDependencies([
  {
    token: INJECTION_TOKEN,
    useValue: () => "test string",
    singleton: false,
  },
  TestClass,
]);

const testClassInstance = container.getDependency<TestClass>(TestClass);

expect(testClassInstance.dependency).toBe("test string");