const crypto = require('crypto'); const WORD_LISTS = { lorem: [ 'lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit', 'sed', 'do', 'eiusmod', 'tempor', 'incididunt', 'ut', 'labore', 'et', 'dolore', 'magna', 'aliqua', 'enim', 'ad', 'minim', 'veniam', 'quis', 'nostrud', 'exercitation', 'ullamco', 'laboris', 'nisi', 'aliquip', 'ex', 'ea', 'commodo', 'consequat', 'duis', 'aute', 'irure', 'in', 'reprehenderit', 'voluptate', 'velit', 'esse', 'cillum', 'fugiat', 'nulla', 'pariatur', 'excepteur', 'sint', 'occaecat', 'cupidatat', 'non', 'proident', 'sunt', 'culpa', 'qui', 'officia', 'deserunt', 'mollit', 'anim', 'id', 'est', 'laborum' ], english: [ 'the', 'quick', 'brown', 'fox', 'jumps', 'over', 'lazy', 'dog', 'and', 'runs', 'through', 'forest', 'while', 'birds', 'sing', 'beautiful', 'songs', 'under', 'bright', 'sunny', 'sky', 'with', 'clouds', 'floating', 'peacefully', 'above', 'green', 'trees', 'beside', 'flowing', 'river', 'where', 'fish', 'swim', 'quietly', 'among', 'rocks', 'covered', 'moss', 'creating', 'natural', 'harmony' ], tech: [ 'algorithm', 'database', 'framework', 'library', 'function', 'variable', 'array', 'object', 'method', 'class', 'interface', 'component', 'module', 'package', 'deployment', 'server', 'client', 'backend', 'frontend', 'fullstack', 'api', 'endpoint', 'authentication', 'authorization', 'encryption', 'decryption', 'blockchain', 'machine', 'learning', 'artificial', 'intelligence', 'neural', 'network', 'deep', 'learning', 'data', 'science', 'analytics', 'visualization' ] }; const CHARACTERS = { lowercase: 'abcdefghijklmnopqrstuvwxyz', uppercase: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', numbers: '0123456789', symbols: '!@#$%^&*()_+-=[]{}|;:,.<>?', special: '!@#$%^&*' }; const generateRandomWords = (count, wordList) => { const words = []; for (let i = 0; i < count; i++) { const randomIndex = Math.floor(Math.random() * wordList.length); words.push(wordList[randomIndex]); } return words.join(' '); }; const generateRandomString = (length, charset) => { let result = ''; for (let i = 0; i < length; i++) { result += charset.charAt(Math.floor(Math.random() * charset.length)); } return result; }; const generatePassword = (length, options) => { let charset = ''; if (options.lowercase) charset += CHARACTERS.lowercase; if (options.uppercase) charset += CHARACTERS.uppercase; if (options.numbers) charset += CHARACTERS.numbers; if (options.symbols) charset += CHARACTERS.symbols; if (!charset) charset = CHARACTERS.lowercase + CHARACTERS.uppercase + CHARACTERS.numbers; return generateRandomString(length, charset); }; const generateSentences = (count, wordList, minWords = 5, maxWords = 15) => { const sentences = []; for (let i = 0; i < count; i++) { const wordCount = Math.floor(Math.random() * (maxWords - minWords + 1)) + minWords; const words = []; for (let j = 0; j < wordCount; j++) { const randomIndex = Math.floor(Math.random() * wordList.length); words.push(wordList[randomIndex]); } let sentence = words.join(' '); sentence = sentence.charAt(0).toUpperCase() + sentence.slice(1) + '.'; sentences.push(sentence); } return sentences.join(' '); }; const handler = async (req, res) => { try { const { type = 'words', count = 10, length = 12, wordType = 'lorem', includeNumbers = true, includeUppercase = true, includeLowercase = true, includeSymbols = false, minWords = 5, maxWords = 15 } = req.query; const validTypes = ['words', 'sentences', 'paragraphs', 'password', 'string', 'uuid']; const validWordTypes = Object.keys(WORD_LISTS); if (!validTypes.includes(type)) { return res.status(400).json({ success: false, error: `Invalid type. Valid types: ${validTypes.join(', ')}` }); } if (!validWordTypes.includes(wordType) && ['words', 'sentences', 'paragraphs'].includes(type)) { return res.status(400).json({ success: false, error: `Invalid wordType. Valid wordTypes: ${validWordTypes.join(', ')}` }); } let result = ''; const wordList = WORD_LISTS[wordType] || WORD_LISTS.lorem; switch (type) { case 'words': result = generateRandomWords(parseInt(count), wordList); break; case 'sentences': result = generateSentences(parseInt(count), wordList, parseInt(minWords), parseInt(maxWords)); break; case 'paragraphs': const paragraphs = []; for (let i = 0; i < parseInt(count); i++) { const sentenceCount = Math.floor(Math.random() * 6) + 3; paragraphs.push(generateSentences(sentenceCount, wordList, parseInt(minWords), parseInt(maxWords))); } result = paragraphs.join('\n\n'); break; case 'password': const passwordOptions = { lowercase: includeLowercase === 'true', uppercase: includeUppercase === 'true', numbers: includeNumbers === 'true', symbols: includeSymbols === 'true' }; result = generatePassword(parseInt(length), passwordOptions); break; case 'string': let charset = ''; if (includeLowercase === 'true') charset += CHARACTERS.lowercase; if (includeUppercase === 'true') charset += CHARACTERS.uppercase; if (includeNumbers === 'true') charset += CHARACTERS.numbers; if (includeSymbols === 'true') charset += CHARACTERS.symbols; if (!charset) charset = CHARACTERS.lowercase + CHARACTERS.numbers; result = generateRandomString(parseInt(length), charset); break; case 'uuid': result = crypto.randomUUID(); break; } res.json({ success: true, data: { type, result, length: result.length, word_count: result.split(' ').length, generated_at: new Date().toISOString(), parameters: { type, count: parseInt(count), length: parseInt(length), wordType, includeNumbers: includeNumbers === 'true', includeUppercase: includeUppercase === 'true', includeLowercase: includeLowercase === 'true', includeSymbols: includeSymbols === 'true' } } }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } }; module.exports = { name: 'Random Text Generator', description: 'Generate random text, words, sentences, passwords, and UUIDs', type: 'GET', routes: ['api/tools/random/text'], tags: ['utility', 'random', 'generator', 'text'], parameters: ['type', 'count', 'length', 'wordType', 'includeNumbers', 'includeUppercase', 'includeLowercase', 'includeSymbols'], enabled: true, main: ['tools'], handler };