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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@guialves/tuple

v1.0.1

Published

A TypeScript utility function that converts Promises into Go-style [data, error] tuples for better error handling

Downloads

8

Readme

@guialves/tuple

A lightweight TypeScript utility that converts Promises into Go-style [data, error] tuples for cleaner error handling.

Why?

Traditional Promise error handling with try/catch can lead to nested code and repetitive patterns:

// Traditional approach
try {
  const user = await fetchUser(id);
  try {
    const posts = await fetchUserPosts(user.id);
    // Handle success
  } catch (postsError) {
    // Handle posts error
  }
} catch (userError) {
  // Handle user error
}

With tuple, you get a cleaner, more functional approach:

// With tuple
const [user, userError] = await tuple(fetchUser(id));
if (userError) {
  // Handle user error
  return;
}

const [posts, postsError] = await tuple(fetchUserPosts(user.id));
if (postsError) {
  // Handle posts error
  return;
}

// Handle success - both user and posts are guaranteed to be non-null here

Installation

npm install @guialves/tuple

Usage

Basic Example

import { tuple } from '@guialves/tuple';

async function example() {
  const [data, error] = await tuple(fetch('/api/users'));
  
  if (error) {
    console.error('Request failed:', error);
    return;
  }
  
  // data is guaranteed to be non-null here
  console.log('Success:', data);
}

With TypeScript

The function is fully typed and will infer the correct types:

import { tuple } from '@guialves/tuple';

interface User {
  id: number;
  name: string;
}

async function getUser(id: number): Promise<User> {
  // ... implementation
}

async function example() {
  // TypeScript infers: [User | null, any]
  const [user, error] = await tuple(getUser(1));
  
  if (error) {
    // Handle error
    return;
  }
  
  // user is of type User here (not null)
  console.log(user.name);
}

Multiple Async Operations

import { tuple } from '@guialves/tuple';

async function processUserData(userId: number) {
  const [user, userError] = await tuple(fetchUser(userId));
  if (userError) return { error: 'Failed to fetch user' };
  
  const [profile, profileError] = await tuple(fetchProfile(user.id));
  if (profileError) return { error: 'Failed to fetch profile' };
  
  const [posts, postsError] = await tuple(fetchPosts(user.id));
  if (postsError) return { error: 'Failed to fetch posts' };
  
  return {
    user,
    profile,
    posts
  };
}

API

tuple<T>(promise: Promise<T>): Promise<[T | null, any]>

Converts a Promise into a tuple where:

  • First element: the resolved value (or null if rejected)
  • Second element: the error (or null if resolved)

Parameters:

  • promise: Any Promise to be converted

Returns:

  • Promise<[T | null, any]>: A Promise that resolves to a tuple

Benefits

  • No try/catch blocks: Eliminates the need for try/catch statements
  • Explicit error handling: Forces you to handle errors explicitly
  • Functional style: Promotes a more functional programming approach
  • Type safety: Full TypeScript support with proper type inference
  • Lightweight: Zero dependencies, minimal footprint
  • Go-inspired: Familiar pattern for developers coming from Go

License

MIT

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Repository

https://github.com/justAlves/tuple