UNPKG

@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
"use strict"; 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; } });