Giter VIP home page Giter VIP logo

brandi's Introduction

๐Ÿฅƒ Brandi

Brandi is a dependency injection container powered by TypeScript.

  • Framework agnostic. Can work with any UI or server framework.
  • Lightweight and Effective. It is tiny and designed for maximum performance.
  • Strongly typed. TypeScript support out of box.
  • Decorators free. Does not require additional parameters in tsconfig.json and Reflect polyfill.

Packages

The Brandi packages are available for use with a module bundler or in a Node application.

The Brandi source code is written in TypeScript but we precompile both CommonJS and ESModule builds to ES2018.

Additionally, we provide builds precompiled to ESNext by esnext, esnext:main and esnext:module fields.

TypeScript type definitions are included in the library and do not need to be installed additionally.

Brandi

The core library.

License NPM Version Minzipped Size

# NPM
npm install brandi
# Yarn
yarn add brandi

Brandi-React

The React bindings layer. It lets your React components get dependencies from Brandi containers.

License NPM Version Minzipped Size

Brandi-React requires React 16.8 or later. You'll also need to install Brandi.

# NPM
npm install brandi-react
# Yarn
yarn add brandi-react

No Dependencies

Brandi has no dependencies, but requires the following globals in order to work:

  • Symbol
  • WeakMap

Production

By default, Brandi will be in development mode. The development mode includes warnings about common mistakes and capture()/resotre() Container methods.

Don't forget to set process.env.NODE_ENV to production when deploying your application.

Documentation

You can find the Brandi documentation on the website.

The documentation is divided into several sections:

Examples

Here are just basic examples.

Getting Instance

Binding types and scopes are detailed in Binding Types and Binding Scopes sections of the documentation.

import { Container, token } from 'brandi';

class ApiService {}

const TOKENS = {
  /*          โ†“ Creates a typed token. */
  apiService: token<ApiService>('apiService'),
};

const container = new Container();

container
  .bind(TOKENS.apiService)
  .toInstance(ApiService) /* โ† Binds the token to an instance */
  .inTransientScope(); /*    โ† in transient scope. */

/*                           โ†“ Gets the instance from the container. */
const apiService = container.get(TOKENS.apiService);

expect(apiService).toBeInstanceOf(ApiService);

Snapshoting

import { Container, token } from 'brandi';

const TOKENS = {
  apiKey: token<string>('API Key'),
};

const container = new Container();

container
  .bind(TOKENS.apiKey)
  .toConstant('#key9428'); /* โ† Binds the token to some string. */

/*        โ†“ Captures (snapshots) the current container state. */
container.capture();

container
  .bind(TOKENS.apiKey)
  .toConstant('#testKey'); /* โ† Binds the same token to another value. */
                           /*   For example, this can be used in testing. */

const testKey = container.get(TOKENS.apiKey);

/*        โ†“ Restores the captured container state. */
container.restore();

const originalKey = container.get(TOKENS.apiKey);

expect(testKey).toBe('#testKey');
expect(originalKey).toBe('#key9428');

Other Container methods are detailed in Container section of the documentation.

Hierarchical Containers

Hierarchical containers are detailed in Hierarchical Containers section of the documentation.

import { Container, token } from 'brandi';

class ApiService {}

const TOKENS = {
  apiService: token<ApiService>('apiService'),
};

const parentContainer = new Container();

parentContainer
  .bind(TOKENS.apiService)
  .toInstance(ApiService)
  .inTransientScope();

/*                     โ†“ Creates a container with the parent. */
const childContainer = new Container().extend(parentContainer);

/**                โ†“ That container can't satisfy the getting request,
 *                   it passes it along to its parent container.
 *                   The intsance will be gotten from the parent container.
 */
const apiService = childContainer.get(TOKENS.apiService);

expect(apiService).toBeInstanceOf(ApiService);

brandi's People

Contributors

vovaspace avatar berkliumbirb avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.