Code-generated, type-strong dependency injection for typescript.
Pour yourself a delicious glass of sweet, sweet dependencies.
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.
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.
- 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());
})
See the github wiki for documentation and further tutorial resources.