Skip to content

corps/pitcher

Repository files navigation

pitcher

build status

Code-generated, type-strong dependency injection for typescript.
Pour yourself a delicious glass of sweet, sweet dependencies.

Introduction

Inspired by the DI tools of angular 1.x and Dagger, pitcher aims to be the best of the two approaches: code generation for early error checking, and argument names as convention for simple configuration.

Setup is similar to angular -- Let's create a "module" class that provides an instance of a CoffeePump service.

class CoffeeModule implements pitcher.Module {
  providesCoffeePump = CoffeePump;
}

In this case, CoffeePump is some class we want to construct a singleton for. We can add a dependency on a Thermosiphon by simply declaring it as an argument of said class's constructor. Pitcher will match the name of the argument to a provider of the same name.

class CoffeePump {
  constructor(public thermosiphon:Thermosiphon) {}
}

class ThermosiphonModule implements pitcher.Module {
  providesThermosiphon() { return new Thermosiphon(); }
}

Unlike angular, however, these "dependencies as arguments" will work even through code obfuscation. You also get strong typing, early graph verification, and best of all super simple stack traces thanks to code generation.

Setup

npm install pitcher --save

If you are using tsd, you can then tsd link to add pitcher's .d.ts file to your project. If not, you'll need to add a reference to index.d.ts directly to your project.

pitcher currently only supports typescript >= 1.5.3, requiring the improved type inference for the resulting code.

Usage

Quick Demo

  • Create a module
  import pitcher = require("pitcher");

  interface Endpoint {
    ():string
  }

  class Server {
    constructor(public endpoints:Endpoint[]) {}
  }

  export class AppModule implements pitcher.Module {
    constructor(public providedEnv = "development") {}

    providesServer = Server;

    contributesEndpoints(appName:string, env:string) {
      return [
        () => "Hello world, this is " + appName + " running in " + env + "!";
      ];
    }
  }
  • Add pitcher config to tsconfig.json to identify where modules are located.

    {
      "pitcher": {
        "moduleGlob": "modules/*.ts"
      }
    }
  • Run pitcher

    node_modules/.bin/pitcher
  • Construct your object graph:

import pitcher = require("pitcher");
import { AppModule } from "modules/app";

pitcher.build(new AppModule()).serverProvider.get((server, err) => {
    server.endpoints.forEach((e) => e());
})

Documentation

See the github wiki for documentation and further tutorial resources.

About

Typescript Dependency Injection inspired by Dagger

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published