@alixmixx/unique-username-generator
Version:
A package to generate a unique username from email or randomly selected nouns and adjectives. User can add a separator between the username, define the maximum length of a username and adds up to six random digits.
155 lines (154 loc) • 6.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.nouns = exports.adjectives = exports.uniqueUsernameGenerator = exports.generateUsername = exports.generateFromEmail = exports.Style = void 0;
const data_1 = require("./data");
// Expanded Style enum to include more formatting options
var Style;
(function (Style) {
Style["LowerCase"] = "lowerCase";
Style["UpperCase"] = "upperCase";
Style["Capital"] = "capital";
Style["CamelCase"] = "camelCase";
Style["SnakeCase"] = "snakeCase";
Style["KebabCase"] = "kebabCase";
Style["PascalCase"] = "pascalCase";
})(Style = exports.Style || (exports.Style = {}));
// Function to generate a random number (unsigned 32-bit integers) within a given range
// updated to only use edge runtime compatible apis
const getRandomInt = (min = 0, max = 4294967295) => (Math.random() * ((max | 0) - (min | 0) + 1.0) + (min | 0)) | 0;
const randomNumber = (maxNumber) => {
let randomNumberString;
switch (maxNumber) {
case 1:
randomNumberString = Math.floor(getRandomInt(1, 9)).toString();
break;
case 2:
randomNumberString = Math.floor(getRandomInt(10, 90)).toString();
break;
case 3:
randomNumberString = Math.floor(getRandomInt(100, 900)).toString();
break;
case 4:
randomNumberString = Math.floor(getRandomInt(1000, 9000)).toString();
break;
case 5:
randomNumberString = Math.floor(getRandomInt(10000, 90000)).toString();
break;
case 6:
randomNumberString = Math.floor(getRandomInt(100000, 900000)).toString();
break;
default:
randomNumberString = "";
break;
}
return randomNumberString;
};
function generateFromEmail(email, randomDigits) {
// Retrieve name from email address
const nameParts = email.replace(/@.+/, "");
// Replace all special characters like "@ . _ ";
const name = nameParts.replace(/[&/\\#,+()$~%._@'":*?<>{}]/g, "");
// Create and return unique username
return name + randomNumber(randomDigits);
}
exports.generateFromEmail = generateFromEmail;
/**
* Apply style formatting to an array of words
*/
function applyStyle(words, style) {
if (!style)
return words.join("").toLowerCase();
switch (style) {
case Style.LowerCase:
return words.join("").toLowerCase();
case Style.UpperCase:
return words.join("").toUpperCase();
case Style.Capital: {
const text = words.join("");
const [firstLetter, ...rest] = text.split("");
return firstLetter.toUpperCase() + rest.join("").toLowerCase();
}
case Style.CamelCase:
return words
.map((word, index) => (index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()))
.join("");
case Style.SnakeCase:
return words.map(word => word.toLowerCase()).join("_");
case Style.KebabCase:
return words.map(word => word.toLowerCase()).join("-");
case Style.PascalCase:
return words.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join("");
default:
return words.join("").toLowerCase();
}
}
function generateUsername(separator, randomDigits, length, prefix, style) {
const noun = data_1.nouns[Math.floor(Math.random() * data_1.nouns.length)];
const adjective = prefix
? prefix
.replace(/\s{2,}/g, " ")
.replace(/\s/g, separator !== null && separator !== void 0 ? separator : "")
.toLocaleLowerCase()
: data_1.adjectives[Math.floor(Math.random() * data_1.adjectives.length)];
// Create word array
const words = [adjective, noun];
let username;
if (style) {
// Apply style formatting to words array
username = applyStyle(words, style);
}
else if (separator) {
// Join with separator if no style is applied
username = words.join(separator);
}
else {
// Simple concatenation
username = words.join("");
}
// Add random number
username += randomNumber(randomDigits);
if (length) {
return username.substring(0, length);
}
return username;
}
exports.generateUsername = generateUsername;
function uniqueUsernameGenerator(config) {
if (!config.dictionaries) {
throw new Error("Cannot find any dictionary. Please provide at least one, or leave " + "the 'dictionary' field empty in the config object");
}
else {
const fromDictRander = (i) => config.dictionaries[i][getRandomInt(0, config.dictionaries[i].length - 1)];
const dictionariesLength = config.dictionaries.length;
// Collect words from dictionaries
const words = [];
for (let i = 0; i < dictionariesLength; i++) {
words.push(fromDictRander(i));
}
let username;
if (config.style) {
// Apply style formatting to words array
username = applyStyle(words, config.style);
}
else if (config.separator) {
// Join with separator if no style is applied
username = words.join(config.separator);
}
else {
// Simple concatenation
username = words.join("");
}
// Add random number
username += randomNumber(config.randomDigits);
if (config.length) {
return username.substring(0, config.length);
}
else {
return username.substring(0, 15);
}
}
}
exports.uniqueUsernameGenerator = uniqueUsernameGenerator;
var data_2 = require("./data");
Object.defineProperty(exports, "adjectives", { enumerable: true, get: function () { return data_2.adjectives; } });
Object.defineProperty(exports, "nouns", { enumerable: true, get: function () { return data_2.nouns; } });