random-world
Version:
Node.js module to generate random collections of data.
167 lines (142 loc) • 5.2 kB
JavaScript
/**
* Names module - generates random names, titles, and emails
*/
import { InterfaceResolver } from '../utils/interface-resolver.js';
import { formatString, pickRandom } from '../utils/utilities.js';
import namesDict from './data/names/index.js';
export class Names extends InterfaceResolver {
static namespace = 'names';
static methods = ['firstname', 'lastname', 'fullname', 'title', 'suffix', 'middleName', 'email'];
/**
* Generate a full name (first + last)
* @param {Object} options - Options for name generation
* @returns {string} Full name
*/
fullname(options = {}) {
return [
this.firstname(options),
this.lastname(options)
].join(' ');
}
/**
* Generate a first name
* @param {Object} options - Options including gender ('male', 'female', 'nonbinary'), startsWith, charCase/charcase
* @returns {string} First name
*/
firstname(options = {}) {
let foreNames;
if (options.gender) {
foreNames = namesDict[options.gender];
} else {
foreNames = namesDict.female.concat(namesDict.male).concat(namesDict.nonbinary);
}
if (options.startsWith) {
foreNames = foreNames.filter(foreName =>
foreName.substring(0, options.startsWith.length).toLowerCase() ===
options.startsWith.toLowerCase()
);
}
const charCase = options.charCase || options.charcase;
if (options.charcase && !options.charCase) {
console.warn('[random-world] Deprecation warning: "charcase" option is deprecated, use "charCase" instead');
}
return formatString(pickRandom(foreNames), charCase);
}
/**
* Generate a last name
* @param {Object} options - Options including startsWith, charCase/charcase
* @returns {string} Last name
*/
lastname(options = {}) {
let surnames = namesDict.surnames;
if (options.startsWith) {
surnames = surnames.filter(surname =>
surname.substring(0, options.startsWith.length).toLowerCase() ===
options.startsWith.toLowerCase()
);
}
const charCase = options.charCase || options.charcase;
if (options.charcase && !options.charCase) {
console.warn('[random-world] Deprecation warning: "charcase" option is deprecated, use "charCase" instead');
}
return formatString(pickRandom(surnames), charCase);
}
/**
* Generate a random title (Mr, Mrs, Mx, Dr, etc.)
* @param {Object} options - Options including gender ('male', 'female', 'nonbinary')
* @returns {string} Title
*/
title(options = {}) {
let titles = namesDict.titles;
if (options.gender) {
// Map gender option to title gender codes
// M = male, F = female, N = non-binary, U = unisex (always included)
const genderMap = {
male: 'M',
female: 'F',
nonbinary: 'N'
};
const genderCode = genderMap[options.gender];
if (genderCode) {
titles = titles.filter(t => t.gender === genderCode || t.gender === 'U');
}
}
const title = pickRandom(titles);
return title.name;
}
/**
* Generate a random post-nominal suffix (PhD, MBA, etc.)
* @param {Object} options - Options including type ('doctorate', 'masters', 'bachelors')
* @returns {string} Post-nominal suffix
*/
suffix(options = {}) {
const postNominal = namesDict.postNominal;
let suffixes;
if (options.type && postNominal[options.type]) {
suffixes = postNominal[options.type];
} else {
// Combine all suffix types
suffixes = [
...postNominal.doctorate,
...postNominal.masters,
...postNominal.bachelors
];
}
return pickRandom(suffixes);
}
/**
* Generate a random middle name (uses firstname logic)
* @param {Object} options - Options including gender, startsWith, charCase
* @returns {string} Middle name
*/
middleName(options = {}) {
return this.firstname(options);
}
/**
* Generate a random email address
* @param {Object} options - Options including hasDot, hasPlusAddress, charCase/charcase
* @returns {string} Email address
*/
email(options = {}) {
const opts = {
charCase: 'lower',
charcase: 'lower',
...options
};
const charCase = opts.charCase || opts.charcase;
return formatString(
[
this.firstname(opts),
(opts.hasDot ? '.' : ''),
this.lastname(opts),
(opts.hasPlusAddress ? '+' + this.proxy.strings.word() : ''),
'@',
this.proxy.strings.word(),
'.',
this.proxy.internet.tld(opts)
].join(''),
charCase
);
}
}
export default Names;