customize the lists

This commit is contained in:
cupcakearmy 2020-02-07 16:01:34 +01:00
parent 31d6d4447f
commit 3709f8c0f3
No known key found for this signature in database
GPG Key ID: D28129AE5654D9D9
2 changed files with 36 additions and 4 deletions

View File

@ -53,6 +53,30 @@ const username = generate('{quantity|age|cats|}')
This example will choose a random word between the `quantity`, `age` and `cats` list. This example will choose a random word between the `quantity`, `age` and `cats` list.
### ✒️ Use you own lists
You can also add your own lists or owerwrite the built in one.
```typescript
import { generate } from 'canihazusername'
const gits = ['gitlab', 'github', 'gitea']
const username = generate('{gits}', { lists: { gits } })
```
### 🔐 Reformats limit
For security reasons the default limit for the maximum reformats/insertions is set to 16.
If you use more than 16 `{}` you can increase them with the `maxReformats` option.
```typescript
import { generate } from 'canihazusername'
const username = generate('{1} {2} ... {17}', { maxReformats: 16 }) // ❌ The last one will not be replaced
const username = generate('{1} {2} ... {17}', { maxReformats: 20 }) // ✅
```
## 🗂 Lists ## 🗂 Lists
- age - age

View File

@ -1,11 +1,19 @@
import wordlist from './wordlist.json' import wordlist from './wordlist.json'
const DEFAULT_OPTIONS = {
maxReformats: 16,
lists: {} as { [name: string]: string[] }
}
const randomElementFromArray = <T>(arr: T[]): T => arr[Math.floor(Math.random() * arr.length)] const randomElementFromArray = <T>(arr: T[]): T => arr[Math.floor(Math.random() * arr.length)]
export const showAvailableLists = () => Object.keys(wordlist) export const showAvailableLists = () => Object.keys(wordlist)
export const generate = (format: string = '{character}_{english}', maxReformats = 16): string => { export const generate = (format: string = '{character}_{english}', options: Partial<typeof DEFAULT_OPTIONS> = {}): string => {
for (let i = 0; i < maxReformats; i++) { const opt: typeof DEFAULT_OPTIONS = Object.assign(DEFAULT_OPTIONS, options)
const combined = Object.assign(wordlist, options.lists)
for (let i = 0; i < opt.maxReformats; i++) {
const match = /\{.*?\}/.exec(format) const match = /\{.*?\}/.exec(format)
if (match === null) break if (match === null) break
@ -13,8 +21,8 @@ export const generate = (format: string = '{character}_{english}', maxReformats
.slice(1, -1) .slice(1, -1)
.split('|') .split('|')
.map(key => key.trim()) .map(key => key.trim())
.filter(key => key !== '') as [keyof typeof wordlist] .filter(key => key !== '') as [keyof typeof combined]
const lists = keys.map(key => Array.isArray(wordlist[key]) ? wordlist[key] : []) const lists = keys.map(key => Array.isArray(combined[key]) ? combined[key] : [])
const flatteded = lists.reduce((acc, val) => acc.concat(val), []); const flatteded = lists.reduce((acc, val) => acc.concat(val), []);
const value: string = flatteded.length > 0 const value: string = flatteded.length > 0
? randomElementFromArray(flatteded) ? randomElementFromArray(flatteded)