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

pimp

v0.2.3

Published

Pimp is a small & simple (P)romise/A+ (imp)lementation that I wrote to wrap my head around the spec.

Downloads

24

Readme

pimp

Build Status

A simple (P)romise/A+ spec compliant (imp)lementation that I wrote to wrap my head around it.
It passes all the tests that are part of the Promises/A+ Compliance Test Suite.

##Installation

####For node:

npm install pimp --save-dev

Then go ahead and require it in your node projects as:

var pimp = require('pimp')

####For browsers:

Install using bower:

bower install pimp

#####or

You can grab pimp.min.js and its source map pimp.min.map (optional) from the browser folder
and import it using the usual <script></script> tags anywhere in your code.
It will add a Pimp constructor to the window object as window.Pimp for you to use.

##API

###Constructor

###Public

###Static

###Changelog

##Constructor

###Pimp(function) The constructor returns a Promise.
It accepts a function as a parameter and provides the function with two parameters, resolve and reject.
They can be used to resolve/fulfill or reject the Promise that was returned by the constructor.

Example:

var prom1 = new Pimp(function(fulfill, reject) {
    setTimeout(function() {
        fulfill(10);
    }, 2000);
});

prom1.then(function(v){
    console.log(v); //logs 10 after approximately 2000ms
});

##Public methods

###then(onFulfilled, onRejected) It returns a Promise.
If/when the returned Promise fulfills, it runs the onFulfilled handler.
If/when the returned Promise gets rejected, it runs the onRejected handler.
You can call then on a Promise as many times you want.
Also, You can chain as many then calls as you want.
All registered handlers will be run in sequence when the Promise resolves.

It basically does all that a Promises/A+ compliant then method should do.
Read more here.

Example:

var prom1 = new Pimp(function(fulfill, r) {
    setTimeout(function() {
        fulfill(10);
    }, 2000);
});

prom1.then(function(v) {
    console.log(v); //logs 10
});

prom1.then(function(v) {
    console.log("omg not %o again",v); //logs omg not 10 again
});

###inspect() It tells you the current state of the promise. It returns an object of the form:

{
    state: <state of promise>,
    value/reason: <value/reason of promise>
}

###catch(rejectionHandler) It adds a rejection handler to the promise it is called on. It returns a new promise that resolves to the value of the parent promise or calls
rejectionHandler with the reason the parent promise rejected with. It is essentially a short hand for .then( function(v){ return v; }, rejectionHandler ).

Example:

var p = Pimp.reject(10);
p.catch(function(v){
    console.log(v); //logs 10
});

###finally(callback) It is analogous to finally in try-catch-finally clause and returns a promise.
It lets you run a callback irrespective of the final state of the promise it (i.e., finally) is chained to.
It lets you do so without changing the value/reason/state that the promise it is chained to resolved/rejected with.
Therefore, you can chain to a finally call just like you would if it weren't there i.e., it is transparent.
If the callback given to finally returns a promise, then the resolution of the promise returned by finally is delayed till the promise returned by the callback resolves.
It works like Q's finally implementation.

Example:

var p = Pimp.resolve(10).finally(function(v){
    console.log(v); //logs 10
    return 20;
}).then(function(v){
    console.log(v); //logs 10 (value returned by finally callback is ignored)
});

#####Note:

  • If the callback given to finally throws then the promise returned by finally rejects with that error as reason.

##Static methods

###Pimp.resolve(value) It returns a Promise that is resolved to the value passed to it. The value can be any value as specified here.
If it's a thenable then the returned Promise resolves to it as per the Promises/A+ Resolution Procedure.

Example:

Pimp.resolve(10).then(function(v){
    console.log(v); //logs 10
});

###Pimp.reject(reason) It returns a Promise whose state is rejected and value is the reason provided.

Example:

Pimp.reject("DENIED!").then(function(v) {
    console.log("yo %o", v); //this handler doesn't run as the Promise is rejected
}, function(v) {
    console.log(v); //logs DENIED!
});

###Pimp.cast(value) Casts the value to a Promise of type Pimp and returns the Promise.

Example:

Pimp.cast(";-;").then(function(v){
    console.log(v); //logs ;-;
});

###Pimp.all(iterable) It returns a Promise which resolves when all elements in the iterable resolve.
Its value is an Array of the values returned by each promise in the iterable on their resolution.
If any value in the iterable rejects, then the Promise returned by Pimp.all immediately rejects with its reason.
It rejects with the value returned by what had rejected in the iterable list passed to Pimp.all.
Pimp.all discards all other items in the iterable list irrespective of their state when a reject occurs.

Example:

var p1 = new Pimp(function(resolve, reject) {
    setTimeout(resolve, 5500, "one");
});
var p2 = new Pimp(function(resolve, reject) {
    setTimeout(resolve, 6200, "two");
});

Pimp.all([45, true, p1, p2]).then(function(values) {
    //logs Values resulting from Pimp.all: [45, true, "one", "two"]
    console.log("Values resulting from Pimp.all: %o", values);
});

#####Note:

  • If any value in the iterable is not thenable then it is first cast to a Promise using Pimp.cast internally

###Pimp.allFail(iterable) It returns a Promise which resolves when all elements in the iterable reject.
Its value is an Array of the reasons returned by each promise in the iterable on their rejection.
If any value in the iterable resolves, then the Promise returned by Pimp.all immediately rejects with its value.
It rejects with the value returned by what had resolved in the iterable list passed to Pimp.allFail.
Pimp.allFail discards all other items in the iterable list irrespective of their state when a resolution occurs.

Example:

var p1 = new Pimp(function(resolve, reject) {
    setTimeout(reject, 200, "one");
});
var p2 = new Pimp(function(resolve, reject) {
    setTimeout(reject, 500, "two");
});

Pimp.allFail([p1, p2]).then(function(values) {
    //logs Values resulting from Pimp.all: ["one", "two"] 
    console.log("Values resulting from Pimp.allFail: %o", values);
});

#####Note:

  • If any value in the iterable is not thenable then it is first cast to a Promise using Pimp.cast internally

###Pimp.race(iterable) It returns a Promise that adopts the value/reason of the first item in the iterable that resolves or rejects.

Example:

var p1 = new Pimp(function(resolve, reject) {
    setTimeout(resolve, 500, "one");
});
var p2 = new Pimp(function(resolve, reject) {
    setTimeout(reject, 400, "two");
});
var p3 = new Pimp(function(resolve, reject) {
    setTimeout(reject, 1000, "three");
});
var p4 = new Pimp(function(resolve, reject) {
    setTimeout(resolve, 200, "four");
});

var racer = Pimp.race([p1, p2, p3, p4]);
racer.then(function(value) {
    //logs Value resulting from Pimp.race: "four"
    console.log("Value resulting from Pimp.race: %o", value);
});

#####Note:

  • If any value in the iterable is not thenable then it is first cast to a Promise using Pimp.cast internally

###Pimp.deferred() It returns an object (a "deferred") of the form:

{
    promise: promise,
    resolve: promise.resolve,
    reject: promise.reject,
    inspect: promise.inspect
}

Example:

var p = Pimp.deferred();
p.resolve(10);
console.log(p.inspect().value); //logs 10

###Pimp.denodeify() It takes a Node.js style, callback accepting function and returns a promise returning function.

Example:

var nodeReadFile = require('fs').readFile;
var promisifiedReadFile = Pimp.denodeify(nodeReadFile);
var filePromise = promisifiedReadFile("./path/to/a/file", { encoding: "utf8" });

//assume file contains the data "10"

filePromise.then(function(data){
    console.log(data); //logs 10
    return data;
});

##Changelog

####0.2.3

  • Added Pimp.prototype.finally
  • Added more tests
  • Bugfixes

####0.2.2

  • Bugfixes

####0.2.1

  • major performance upgrade for Pimp in the browser
  • Pimp for the browser now comes bundled with setImmediate shim
  • It now is faster in the browser than Q according to the tests here
  • The build process now tests the generated browser code too

####0.2.0

  • Added Pimp.prototype.catch
  • Added Pimp.denodeify
  • Added Pimp.deferred
  • Changed how Pimp.cast works (it now follows the spec)
  • Added support for browsers
  • Added automated system for generating Pimp for the browser
  • Added a test suite

##Note

  • To be able to run make gen-cov to generate coverage data, you must install node-jscoverage
  • It must also be available in your PATH env variable so that it can be executed from anywhere
  • Since node-jscoverage isn't a node project, I have not listed it as a dependency but it sure is if
    you want to generate coverage info.