cerceis-lib
Version:
Contains list of quality of life functions that is written in TypeScript and es6
350 lines (263 loc) • 9.36 kB
Markdown
# 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
```bash
npm i cerceis-lib@latest
```
## Usage
```ts
// 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";
```
```js
// 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.
```ts
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.
```ts
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.
```ts
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.
```ts
Is.string("hello") // true
Is.number(42) // true
Is.array([]) // true
```
### `KMeans` / `KMeansND`
K-means clustering (1D and N-dimensional).
```ts
// 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
```ts
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
```ts
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
```ts
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` |