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

reliq

v2.4.5

Published

Reliq is a library for building

Readme

Reliq

TypeScript for Ridiculously Robust Code

Reliq is a TypeScript error-handling library inspired by Rust's error-handling paradigms. It brings over useful constructs in a way that makes them practical to use in TypeScript.

Breaking Changes

  • The Option and Result types no longer include unwrap. They now require explicit handling.
  • Standard unwrap and unwrapOr methods have been replaced with unlock and unlockOr. Unlike unwrap, unlock is only available on Ok, Some, and Alloc variants and will not throw errors.
  • The assertion API has been depracated to better align with the rest of the library's design.
  • Recoverable and other depracated APIs may return in a more type-safe format in the future.

API Overview

Result

TypeScript will not map error cases, which causes unknown, undocumented, and unexplicit code to be blow up at runtime. The Result pattern increases code robustness by explicitly handling all possible outcomes at "result-time". Code will now explicitly require proper handling or aknowledgement when something can go wrong.

import { Result as Result$0 } from "reliq";
import { Ok } from "reliq";
import { Err } from "reliq";
import { Error } from "reliq";

type Car = {
    speed(): bigint;
};


function Car(): Car.Result<Car> {
    /** @constructor */ {
        if () return Err("CAR.ERR_MISSING_ENGINE");
        return Ok({ speed });
    }

    function speed(): bigint {
        return 200n;
    }
}

namespace Car {
    export type Result<T1> = Result$0<T1, ErrorCode>;

    export type ErrorCode =
        | "CAR.ERR_MISSING_ENGINE"
        | "CAR.ERR_MISSING_TIRE";
}


/// Declarative

Car()
    .map(car => {
        /** ... */
    })
    .mapErr(e => {
        /** ... */
    });


/// Imperative

function main() {
    let carR: Car.Result<Car> = Car();
    if (carR.err()) return carR;
    let car: Car = carR.unwrap();
}

Option

Optional or missing values can be safely and explicitly handled using Option.

import { Option } from "reliq":
import { Some } from "reliq";
import { None } from "reliq";

function foo(): Option<bigint> {
    if () return Some(200n);
    return None;
}

/// Declarative
foo().map(foo => {
    /// ...
});

/// Imperative
let fooO: Option<bigint> = foo();
if (fooO.none()) return fooO;
let foo: bigint = fooO.unwrap();

Performance

Dyn optimizes garbage collection by recycling instances. It uses Option under the hood to ensure safe access to instances, which may or may not be allocated. The wrapper can still be garbage collected, caution is required to avoid memory leaks.

import type { DynConstructor } from "reliq";
import { Dyn } from "reliq";

type Car = {
    reset(): Car;
};

const Car: DynConstructor = Dyn(
    () => {
        let _this: Car;

        /** @constructor */ {
            return _this = { reset };
        }

        function reset(): Car {
            return _this;
        }
    },
    
    /// The `onDeAlloc` task.
    car => car.reset(),

    /// The amount of instances to create and store.
    1000n
);

let carD: Dyn<Car> = Car();
carD.map(car => {
    /// Will run because `carD` is allocated.
    /// ...
});
carD = carD.deAlloc();
/// Car is now deallocated, recyled, and ready to be reallocated without being garbag collected.
/// ...

Math

Use Fpv for fixed point arithmetics instead of number for more robust and predictable math.

    import { Fpv } from "reliq";

    let price: Fpv<2n> = Fpv(2000n).expect(); /// 20.00
    price = price.mul(50n); /// 0.50
    console.log(price); /// 10.00 1000n