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 🙏

© 2024 – Pkg Stats / Ryan Hefner

pitcher

v0.2.2

Published

Code generated dependency injection for Typescript

Downloads

39

Readme

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.