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

nhb-toolbox

v4.28.21

Published

A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.

Readme

NHB Toolbox

“I solve problems you face daily”

JavaScript/TypeScript Utility Library

NHB Toolbox provides battle-tested utilities for professional JavaScript/TypeScript development. Carefully crafted to solve common challenges with elegant, production-ready solutions:

  • Helper Functions & Classes: Reusable solutions for everyday tasks
  • Type Guards & Predicates: Runtime safety with perfect type inference
  • Validation Utilities: Robust data validation patterns
  • Zero Dependencies: Framework-agnostic implementation using only native TS/JS with 0 external package

Explore Full Documentation →


Installation

nhb-toolbox is published to two package registries:

  • NPM Registry (default public registry)
  • GitHub Packages (GitHub’s package registry, scoped package)

Installing from NPM Registry (default)

This is the simplest way to install and requires no additional setup.

Choose your preferred package manager:

npm i nhb-toolbox
pnpm add nhb-toolbox
yarn add nhb-toolbox

Use this if you want the stable public version without extra config.


Installing from GitHub Packages

GitHub Packages requires authentication and scoped package names.

Step 1: Authenticate with GitHub Packages

Create or use a GitHub Personal Access Token (PAT) with read:packages permission.

Add the following to your project’s .npmrc file (create if it doesn’t exist):

@nazmul-nhb:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=YOUR_GITHUB_PERSONAL_ACCESS_TOKEN

Replace YOUR_GITHUB_PERSONAL_ACCESS_TOKEN with your actual token.

Step 2: Install the package with scoped name

Choose your preferred package manager:

npm i @nazmul-nhb/nhb-toolbox
pnpm add @nazmul-nhb/nhb-toolbox
yarn add @nazmul-nhb/nhb-toolbox

Where do consumers get the GitHub token?

  • The token is personal and privateeach consumer must create own.

  • Your GitHub Personal Access Token (PAT) should never be shared publicly or with consumers.


How consumers create own token

  1. Go to GitHub account settingsDeveloper settingsPersonal access tokensTokens (classic).

  2. Click Generate new token, then:

    • Give it a name (e.g., npm package read access).

    • Set expiration as prefer.

    • Enable only the read:packages permission (to allow reading packages).

  3. Generate the token and copy it immediately — won't see it again.


What should consumers do with the token?

  • Add it to .npmrc file (or environment) to authenticate with GitHub Packages.

Example .npmrc snippet:

@nazmul-nhb:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=PERSONAL_ACCESS_TOKEN_HERE

Summary

| Registry | Package Name | Registry URL | Requires Auth? | | --------------- | ------------------------- | -------------------------------------------------------- | ------------------------------ | | NPM Registry | nhb-toolbox | https://registry.npmjs.org | No | | GitHub Packages | @nazmul-nhb/nhb-toolbox | https://npm.pkg.github.com | Yes (PAT with read:packages) |


If you want to use both, just configure .npmrc accordingly and install the appropriate package name depending on your needs.


Notes

  • The GitHub Packages version may include pre-release or private builds.
  • NPM Registry version is the recommended default for most users.
  • You can safely use either registry depending on your environment.

Changelog

See Changelog for recent updates.


Key Features

  • Type-Safe Utilities:Fully typed for perfect TypeScript integration with strict type checking
  • Modular Design: Tree-shaking friendly – import only what you need with zero bloat
  • Zero Dependencies: No external dependencies - works with any JS/TS framework
  • IDE Support: Full type hints with JSDoc-powered API references in your editor
  • Comprehensive Documentation: Learn with real-world use cases on documentation site
  • Battle-Tested: Reliable utilities refined through real-world production use
  • Optimized for Production: Focused on clean, efficient implementations

Signature Utilities

🕰️ Date & Time Mastery

Chronos - The ultimate date/time manipulation class with 100+ methods for parsing, formatting, calculating, and comparing dates. Handles all edge cases and timezones safely.

🧩 Note: Some methods in Chronos are available only through the plugin system. This modular design ensures the core bundle stays lightweight — plugins are loaded only when needed, reducing unnecessary code in your final build.

new Chronos('2025-01-01').addDays(3).format('YYYY-MM-DD'); // "2025-01-04"
// or with `Chronos` wrapper
chronos('2025-01-01').addDays(3).format('YYYY-MM-DD'); // "2025-01-04"

Documentation →


🎨 Professional Color Manipulation

Color - Convert between color formats, generate palettes, check accessibility contrast, and perform advanced color math with perfect type safety.

const blue = new Color('#0000ff');
const darkerBlue = blue.applyDarkness(20); // 20% darker
console.log(darkerBlue.hsl); // "hsl(240, 100%, 40%)" (was 50%)

Documentation →


🔍 Optimized Array Search

Finder - Blazing-fast array searching with binary search, fuzzy matching, and smart caching. Perfect for large datasets.

const productFinder = new Finder(products);

const laptop = productFinder.findOne('laptop', 'category', {
 fuzzy: true,
 caseInsensitive: false,
});

Documentation →


🆔 Random ID Generation

generateRandomID - Enterprise-grade unique ID generation with prefixes, timestamps, and formatting.

generateRandomID({
 prefix: 'user',
 timeStamp: true,
 length: 12,
 caseOption: 'upper',
}); // "USER-171234567890-AB3C4D5E6F7G"

Documentation →


🔢 Pluralize Strings and More

pluralizer - Handles English word pluralization and singularization with support for irregular forms and uncountable nouns.

import { pluralizer } from 'nhb-toolbox';

pluralizer.pluralize('child'); // "children"
pluralizer.pluralize('category', { count: 3 }); // "categories"
pluralizer.pluralize('child', { count: 1, inclusive: true }); // "1 child"

pluralizer.toSingular('geese'); // "goose"
pluralizer.toSingular('children'); // "child"

pluralizer.isPlural('children'); // true
pluralizer.isSingular('child'); // true
pluralizer.isPlural('fish'); // true (uncountable)

Documentation →


🎨 Color System Utilities

getColorForInitial - Deterministic color mapping system for consistent UI theming

// Get color palette for user avatars
getColorForInitial(['Alice', 'Bob', 'Charlie']);
// ['#00094C', '#00376E', '#005600']

getColorForInitial('Banana', 50); // '#00376E80' (50% opacity)

Documentation →


📄 FormData Preparation

createFormData - Convert JavaScript objects into FormData with extensive configuration options for handling nested structures, files, and data transformations.

import { createFormData } from 'nhb-toolbox';

const formData = createFormData({
  user: {
    name: ' John Doe ',
    age: 30,
    preferences: { theme: 'dark' }
  },
  files: [file1, file2]
}, {
  trimStrings: true,
  lowerCaseValues: ['user.name'],
  dotNotateNested: ['user.preferences'],
  breakArray: ['files']
});

// Resulting FormData:
// user.name=john doe
// user.age=30
// user.preferences.theme=dark
// files[0]=[File1]
// files[1]=[File2]

Documentation →


🛡️ Data Sanitization

sanitizeData - Clean and normalize strings/objects by trimming whitespace, removing empty values, and applying customizable filters.

const user = {
 name: '  John Doe  ',
 age: null,
 address: { city: '  NYC  ', zip: '' },
 tags: [],
};

sanitizeData(user, { ignoreNullish: true, ignoreEmpty: true });
// Returns { name: "John Doe", address: { city: "NYC" } } with exact input type which may cause issue when accessing missing properties

sanitizeData(user, { ignoreNullish: true, ignoreEmpty: true }, 'partial');
// Return type: $DeepPartial<typeof user> safe property access by making all the properties (nested objects/arrays) optional 
// Returns { name: "John Doe", address: { city: "NYC" } }

Documentation →


🔄 JSON Hydration

parseJSON - Bulletproof JSON parsing with primitive conversion

parseJSON('{"value":"42"}'); // { value: 42 } (auto-converts numbers)

Documentation →


🔢 Number to Words

numberToWords - Convert numbers to human-readable words (supports up to 100 quintillion).

numberToWords(125); // "one hundred twenty-five"

Documentation →


🔢 Advanced Number Operations

getNumbersInRange - Generate intelligent number sequences with prime, even/odd, and custom filtering capabilities

// Get primes between 10-30 as formatted string
getNumbersInRange('prime', { min: 10, max: 30, getAsString: true });
// "11, 13, 17, 19, 23, 29"

Documentation →

calculatePercentage - Swiss Army knife for percentage calculations with 7 specialized modes

// Calculate percentage change
calculatePercentage({
 mode: 'get-change-percent',
 oldValue: 100,
 newValue: 150,
}); // 50 (50% increase)

Documentation →


🔄 Extract Updated Fields

extractUpdatedFields - Detect exactly what changed between two objects (including deep nested changes).

const dbRecord = { id: 1, content: 'Hello', meta: { views: 0 } };
const update = { content: 'Hello', meta: { views: 1 } };
extractUpdatedFields(dbRecord, update);
// { meta: { views: 1 } }

Documentation →


🎨 Style Console Output(s)

Stylog - Chalk-like minimal utility to style console output(s) in both Node.js & Browser environment(s) (supports named CSS colors).

// Basic coloring
Stylog.error.log('Error message');
Stylog.success.log('Success message');
Stylog.info.log('Info message');
Stylog.whitesmoke.log('I am White!');

// Multiple styles
Stylog.blue.bold.underline.log('I am Bold Underlined Blue!');

// With object stringification
Stylog.magenta.italic.log({ data: 'value' }, true);

Documentation →


⚡ Performance Optimizers

throttleAction - Precision control for high-frequency events

// Smooth scroll handling
throttleAction(updateScrollPosition, 100);

Documentation →

debounceAction - Intelligent delay for expensive operations

// Search-as-you-type
debounceAction(fetchResults, 300);

Full Documentation →

These utilities represent just a portion of the comprehensive nhb-toolbox. Each is designed with production-grade reliability and developer experience in mind. Explore more in the full documentation. All the utilities and classes are categorized.


🔗 Related Packages


License

This project is licensed under the Apache License 2.0 with the following additional requirement:

Additional Requirement:

Any fork, derivative work, or redistribution of this project must include clear attribution to Nazmul Hassan in both the source code and any publicly available documentation.

You are free to use, modify, and distribute this project under the terms of the Apache 2.0 License, provided that appropriate credit is given.