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 🙏

© 2025 – Pkg Stats / Ryan Hefner

promisary

v1.1.0

Published

A growing collection of utilities to make working with Promises easier and cleaner.

Readme

promisary

npm version license tests

A growing collection of utilities to make working with Promises easier and cleaner.


✨ What is it?

promisary is a growing collection of promise utilities to make async JavaScript easier and cleaner.

The first utilities available are hash and hashSettled, which help you work with objects of promises.

  • hash: Like Promise.all, but for objects. Rejects if any promise rejects.
  • hashSettled: Like Promise.allSettled, but for objects. Always resolves with a fulfilled or rejected state.

More utilities are planned for future releases!


📦 Installation

pnpm add promisary
# or
npm install promisary
# or
yarn add promisary

🔥 Usage

hash

import { hash } from 'promisary';

async function loadData() {
  const result = await hash({
    user: fetchUser(),
    posts: fetchPosts(),
  });

  console.log(result.user); // Resolved user
  console.log(result.posts); // Resolved posts
}

You can mix promises and plain values too:

const result = await hash({
  a: 1,
  b: Promise.resolve(2),
  c: asyncOperation(),
});
console.log(result); // { a: 1, b: 2, c: <resolved value of asyncOperation> }

If any promise rejects, the whole hash will reject immediately:

await hash({
  a: Promise.reject(new Error('fail')),
  b: Promise.resolve(2),
});
// -> throws Error: fail

hashSettled

import { hashSettled } from 'promisary';

async function loadDataSettled() {
  const result = await hashSettled({
    user: fetchUser(),
    posts: fetchPosts(),
  });

  console.log(result.user); // { state: 'fulfilled', value: ... }
  console.log(result.posts); // { state: 'fulfilled', value: ... } or { state: 'rejected', reason: ... }
}

You can safely inspect each result without worrying about rejected promises throwing errors.


🛠 Why use this?

  • Drop-in replacement for RSVP.hash and RSVP.hashSettled.
  • No extra dependencies besides native Promises.
  • Tiny and tree-shakable (~300 bytes minified).
  • TypeScript ready and fully tested.

Perfect for cleaning up older Ember.js apps or anywhere you want better Promise ergonomics.


✅ Features

  • Supports plain values and promises.
  • Rejects early (with hash) or always resolves (with hashSettled).
  • Fully typed with TypeScript.
  • Lightweight and fast.
  • More Promise utilities coming soon!

📅 Roadmap

Here are some utilities planned for future releases:

  • timeout — Add a timeout to any promise, rejecting if it takes too long.
  • raceObject — Like Promise.race, but for an object of promises.
  • delay — Create a promise that resolves after a specified delay.
  • More to come!

Have ideas? Open an issue or send a PR!


📜 License

MIT