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

handler-builder

v1.1.0

Published

Sort of like overloading, but more dynamic

Downloads

4

Readme

handler-builder

Sort of like overloading, but more dynamic. Allows you to create a single handler function from a bunch of more special purpose ones. TypeScript definitions are built in.

Installation

$ npm install --save handler-builder

Example

A good use of this could be to handle Redux actions. There are two ways to do it, depending on what you like to do.

Option 1 is to use a plain JavaScript object:

import HandlerBuilder, { defaultHandlerSymbol } from 'handler-picker';

let reducerBuilder = new HandlerBuilder<string>(
  // how to decide what a call is for
  (state, action) => action.type,
  // what to do in the default case
  (state, action) => state
);

// build a function which will call the correct reducer
let todoReducer = reducerBuilder.build({
  ADD_TODO(state, action) {
    return [...state, {id: action.id, text: action.text, completed: action.completed}];
  },

  REMOVE_TODO(state, action) {
    return state.filter((todo) => todo.id !== action.id);
  },

  // this can give an instance specific default
  // overriding the default passed to the constructor, if supplied
  [defaultHandlerSymbol](state, action) {
    return state;
  }
});

// todoReducer is a reducer function
let newState = todoReducer(state, action);

Option 2 is to use the decorators on a class:

import HandlerBuilder, { handler, defaultHandler } from 'handler-picker';

let reducerBuilder = new HandlerBuilder<string>(
  // how to decide what a call is for
  (state, action) => action.type,
  // what to do in the default case
  (state, action) => state
);

// define a class with handlers in it
class TodoReducers {
  @handler('ADD_TODO')
  addTodo(state, action) {
    return [...state, {id: action.id, text: action.text, completed: action.completed}];
  }

  @handler('REMOVE_TODO')
  removeTodo(state, action) {
    return state.filter((todo) => todo.id !== action.id);
  }

  // this can give an instance specific default
  // overriding the default passed to the constructor, if supplied
  @defaultHandler
  defaultHandler(state, action) {
    return state;
  }
}

// build a function which will call the correct method on TodoReducers
let todoReducer = reducerBuilder.build(new TodoReducers());

// todoReducer is a reducer function
let newState = todoReducer(state, action);

API

HandlerBuilder class

This is the main class.

constructor(selector, defaultValue)

Constructor. The selector parameter is a function which takes the same arguments as the resulting handler function, and returns a value that descriminates which handler to call.

The defaultParameter value says what to do in the event that a matching handler is not found. If no value was provided, and there is no method marked with defaultHandler, then an exception is thrown. If a value is provided, that value is returned. If a function is provided, then the function is called with the arguments supplied to the resulting handler function, and the value returned is what is returned to the caller.

build(target)

Returns a handler function which decides which handler method on the target to call, calls it, and returns the result.

Decorators

@handler(key)

Marks the method as handling the specified descriminator value. I.e., when the handler function is called, it calls the selector function passed to the constructor, and if the value returned is the same as key, then this method is called with the same arguments.

@defaultHandler

Marks the method as handling the case where no other matching handler is found. This will take precedence over any defaultValue passed to the constructor.

Misc

defaultHandlerSymbol

When using the plain JavaScript object method, store the default handler under this key.