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

cerceis-lib

v2.6.0

Published

Contains list of quality of life functions that is written in TypeScript and es6

Readme

Cerceis Library · cerceis-lib

A quality-of-life utility library written in TypeScript.
Tree-shakeable · Dual CJS/ESM · Fully typed · Zero runtime dependencies

Author: Cerceis


Installation

npm i cerceis-lib@latest

Usage

// Named import from the main entry (tree-shakeable)
import { Generate } from "cerceis-lib";
const id = Generate.objectId();

// Subpath import — only bundles what you need
import { GA } from "cerceis-lib/genetic";
// CommonJS
const { Generate } = require("cerceis-lib");

Module Catalog

Most functions are documented with JSDoc — hover over them in your IDE for full details.


Constant

Database of named value lists.

| Property | Description | |---|---| | gemStones | List of gem stone names | | colors | List of color names |


Delay

Async sleep helper.

await Delay(500); // wait 500 ms

FromArray

Collection of array utilities.

| Method | Description | |---|---| | getRandom | Pick a random element | | getLargest | Get the N largest elements | | getSmallest | Get the N smallest elements | | getIntersect | Intersection of two arrays | | shuffle | Shuffle in place | | thanosSnap | Randomly remove half the elements | | toObject | Convert array to object | | log | Pretty-print an array (supports index range) |


FromNum

Collection of number utilities.

| Method | Description | |---|---| | roll(n) | Returns true with n% probability | | diceRoll(n).D(sides) | Roll N dice with given sides | | minMaxScale | Normalise to 0–1 | | unminMaxScale | Reverse min-max normalisation | | sum | Sum an array of numbers | | mean | Arithmetic mean | | softMax | Softmax probability distribution | | sigmoid | Sigmoid activation | | relu | ReLU activation | | softPlus | Soft-plus activation | | toNearest | Round to nearest N | | toRomanNumeral | Convert to Roman numeral string | | toShortReadable | e.g. 1500000"1.5m" |


FromObject

Collection of object utilities.

| Method | Description | |---|---| | ObjectToArray | Convert object to array of entries | | flatten | Flatten a nested object | | getDeepest | Get the deepest entries | | sumAll | Sum all numeric values | | min / max | Find min/max value |


FromString

Collection of string utilities.

| Method | Description | |---|---| | copyToClipboard | Copy to clipboard | | replaceFirst(n, s) | Replace first N characters | | replaceLast(n, s) | Replace last N characters | | parseCookies | Parse HTTP cookie string into object | | deepClean | Strip all non-alphanumeric characters | | count(word) | Count occurrences of a substring |


FromTime / cDate

Date and time utilities.

| Method | Description | |---|---| | format | Format a Date as "YYYY-MM-DD HH:mm:ss" | | toMs / toSeconds / toMinutes / toHours | Time-unit conversions | | toDateTimeShortLocale | Short human-readable date string | | jpnDayMap | Integer → Japanese day label | | cDate(date).addMonth(n) | Advance a date by N months |


FromVector / createVector

2D/3D vector math.

const v = createVector(3, 4);
v.mag();       // 5
v.normalize();
v.add(other);

| Method | add sub mult div mag magSq normalize limit setMag heading dist copy toVector2 toVector3 | |---|---|


Gacha

Weighted random selection system.

const g = new Gacha();
g.addEntries("Common",  70);
g.addEntries("Rare",    25);
g.addEntries("Legendary", 5);
g.getRandom(); // "Common", "Rare", or "Legendary"

Generate

Data generation helpers.

| Method | Description | |---|---| | objectId() | MongoDB-style object ID | | alphanum(n) | Random alphanumeric string | | alphabate(n) | Random alphabetic string | | int(min, max) | Random integer in range | | random(min, max) | Random float in range | | array(type, n) | Array of generated values | | currentDate() | "YYYY-MM-DD" | | currentTime() | "HH:mm:ss" | | currentDateTime() | "YYYY-MM-DD HH:mm:ss" | | listOfDateOfDays(day, n) | List of dates for a given weekday |


Is

Type-guard helpers.

Is.string("hello")   // true
Is.number(42)        // true
Is.array([])         // true

KMeans / KMeansND

K-means clustering (1D and N-dimensional).

// 1-D
const clusters = KMeans(3, [1, 2, 10, 11, 50, 51]);

// N-D (e.g. customer segmentation)
const segments = KMeansND(3, customers, (c) => [c.recency, c.spend]);

Logger

Colourful, structured console.log wrapper.


Obfuscator

Simple string obfuscation / deobfuscation.


Sha256

Pure-TypeScript SHA-256 implementation.


Validator

Form input validation with locale support (en, ja).


GA — Genetic Algorithm

Import: import { GA } from "cerceis-lib/genetic"
or include via the main entry: import { GA } from "cerceis-lib"

A scaffold toolkit for building genetic algorithms. Fully generic — the gene type G can be any value: numbers, booleans, strings, or arbitrary objects with any fields you define.

Core workflow

import { GA } from "cerceis-lib/genetic";

// 1. Define your gene factory (returns one random gene)
const factory = () => Math.round(Math.random()) as 0 | 1;

// 2. Create a random population
const pop = GA.evaluate(
    GA.createPopulation(50, 20, factory),
    (genes) => genes.reduce((a, b) => a + b, 0), // count set bits
);

// 3. Evolve
const result = GA.run({
    population: pop,
    fitnessFn: (genes) => genes.reduce((a, b) => a + b, 0),
    generations: 100,
    mutationRate: 0.02,
    geneFactory: factory,
    onGeneration: (best, gen) => console.log(`Gen ${gen}: ${best.fitness}`),
});

console.log(result.best.genes, result.best.fitness);

Custom object genes

type Gene = { weight: number; active: boolean; label: string };

const pop = GA.createPopulation<Gene>(50, 10, () => ({
    weight: Math.random(),
    active: Math.random() < 0.5,
    label: `node-${Math.floor(Math.random() * 100)}`,
}));

const evaluated = GA.evaluate(pop, (genes) =>
    genes.filter((g) => g.active).reduce((s, g) => s + g.weight, 0),
);

Population helpers

| Function | Description | |---|---| | GA.createPopulation(size, length, factory) | Create a population of random individuals | | GA.evaluate(pop, fitnessFn) | Score every individual; returns a new array | | GA.sort(pop, order?) | Sort by fitness ('desc' = best first, default) | | GA.best(pop, n?) | Return the top-n fittest individuals |

Selection operators

| Function | Description | |---|---| | GA.selection.tournament(pop, size?) | Best of size random picks (default 3) | | GA.selection.roulette(pop) | Fitness-proportionate probability | | GA.selection.rank(pop) | Rank-based — reduces premature convergence |

Crossover operators

| Function | Description | |---|---| | GA.crossover.singlePoint(p1, p2) | Split at one random cut, swap tails | | GA.crossover.twoPoint(p1, p2) | Swap the segment between two cuts | | GA.crossover.uniform(p1, p2, rate?) | Gene-by-gene random mix (default 0.5) |

Mutation operators

| Function | Encoding | Description | |---|---|---| | GA.mutation.bitFlip(ind, rate) | Binary / boolean | Flip each gene with probability rate | | GA.mutation.swap(ind, rate) | Permutation | Swap two random positions | | GA.mutation.inversion(ind, rate) | Permutation | Reverse a random sub-sequence | | GA.mutation.randomReset(ind, rate, factory) | Any | Replace each gene with a new random value |

GA.run options

GA.run({
    population,       // pre-evaluated population
    fitnessFn,        // (genes: G[]) => number  (higher = better)
    generations,      // number of generations to run
    mutationRate,     // default 0.01
    geneFactory,      // required for randomReset; also used as default mutation
    selection,        // 'tournament' | 'roulette' | 'rank'  (default 'tournament')
    tournamentSize,   // default 3
    crossover,        // 'single-point' | 'two-point' | 'uniform'  (default 'single-point')
    elitismRate,      // fraction carried unchanged each gen  (default 0.1)
    onGeneration,     // (best, generationIndex) => void
})

Returns { best, finalPopulation, history } where history is the best fitness per generation.


Changelog

| Version | Date | Description | |---|---|---| | 2.5.0 | 2026-04-12 | Added GA genetic algorithm module | | 2.4.0 | 2025-05-08 | Modernised build (tsup), vitest tests, subpath exports, locale rename | | 2.2.3 | 2023-01-11 | Added FromNum.toShortReadable | | 2.2.2 | 2023-01-06 | Added Constant | | 2.2.0 | 2023-01-05 | Added FromVector | | 2.1.0 | 2022-10-05 | New math functions, fixed Delay memory leak | | 2.0.1 | 2022-08-16 | Major restructure | | 1.5.70 | 2022-08-09 | Added FromObject | | 1.5.62 | 2022-06-09 | Added Num | | 1.5.30 | 2022-03-14 | Added Is | | 1.5.0 | 2022-02-16 | Added Delay, CJS + MJS dual output | | 1.3.0 | 2021-12-28 | Added JSDoc, merged modules into Generate / FromArray | | 1.2.0 | 2021-12-23 | Added KMeans, StringPadding | | 1.1.0 | 2021-12-17 | Added Logger, CopyToClipboard |