README.md
# nid
### Nice clean-mouthed random id generation, without any swearing!
A Node.js module that generates random identifiers for public consumption. Swear words not included.
[![npm version](https://img.shields.io/npm/v/nid.svg)](https://npmjs.com/package/nid)
[![build](https://github.com/rjrodger/nid/actions/workflows/build.yml/badge.svg)](https://github.com/rjrodger/nid/actions/workflows/build.yml)
[![Coverage Status](https://coveralls.io/repos/github/rjrodger/nid/badge.svg?branch=main)](https://coveralls.io/github/rjrodger/nid?branch=main)
[![Known Vulnerabilities](https://snyk.io/test/github/rjrodger/nid/badge.svg)](https://snyk.io/test/github/rjrodger/nid)
[![DeepScan grade](https://deepscan.io/api/teams/5016/projects/21043/branches/592913/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=5016&pid=21043&bid=592913)
[![Maintainability](https://api.codeclimate.com/v1/badges/7334f15641ad06bfc86d/maintainability)](https://codeclimate.com/github/rjrodger/nid/maintainability)
| ![Voxgig](https://www.voxgig.com/res/img/vgt01r.png) | This open source module is sponsored and supported by [Voxgig](https://www.voxgig.com). |
|---|---|
### What it Does
This module is useful for custom short links, password generation and
any sort of unique tag an end user might see.
By default the [big seven curse words](http://en.wikipedia.org/wiki/Seven_dirty_words) are avoided
(thanks [@dshaw](http://twitter.com/dshaw)!). The [Battlestar Galactica version](http://en.battlestarwiki.org/wiki/Frak) of one of the big seven is also avoided.
NOTE: this module is *not* cryptographically secure and should only be used in low-risk environments.
### Quick example
```JavaScript
var nid = require('nid')
// generate a 6 character alphanumberic id, like: ytnzt2
console.log( nid() )
// generate a 3 character alphanumberic id, like: 5rg
console.log( nid(3) )
```
## Install
```sh
npm install nid
```
## Length
You can change the length of the identifier string by passing an
integer to _nid_, as per the quick example above. The default
alphanumeric alphabet is used.
## Options
You can change the ids generated by passing an options object to the
_nid_ function. A new, custom, function is returned. For example:
```JavaScript
var mynid = require('nid')({length:8})
// generate an 8 character alphanumberic id, like: qnzvetvp
console.log( mynid() )
```
You have the following options:
* _length_: number of characters in the id string
* _alphabet_: a string containing the set of characters in the id, e.g. 1234567890abcdef
* _curses_: specify the list of curse words to avoid (you can use _exclude_ as an alias if you don't want to sound quaint)
You can specify the curses as:
* an array of strings: ["gosh","darn"]
* a CSV formatted string: "gosh, darn"
* a regular expression: matches are excluded
* a function: first arg is the proposed id, return true to exclude
As a convenience you can use the following alphabet shortcuts:
* _hex_: alphabet is '0123456789abcdef'
* _HEX_: alphabet is '0123456789ABCDEF'
### Examples:
```JavaScript
var nid = require('nid')
var nid_ABC = nid({alphabet:'ABC'})
console.log(nid_ABC()) // prints something like BCCABB
var nid_hex = nid({hex:1})
console.log(nid_hex()) // prints something like 47b5df
var nid_noa = nid({curses:/a/})
console.log(nid_noa()) // never includes an 'a' character
```
## How it Works
Keep getting a random character from a given alphabet of characters,
until you have enough to meet the length requirement. Then check if it
contains a curse word (case-insensitive). If so, try again.