import * as plugins from './smartstring.plugins.js'; /** * Cross-platform random number generator * Uses crypto.getRandomValues in browser and Math.random as fallback */ const getRandomInt = (min: number, max: number): number => { if (typeof globalThis !== 'undefined' && globalThis.crypto && globalThis.crypto.getRandomValues) { // Browser environment with crypto API const range = max - min; const array = new Uint32Array(1); globalThis.crypto.getRandomValues(array); return min + (array[0] % range); } else { // Fallback to Math.random for environments without crypto return Math.floor(Math.random() * (max - min)) + min; } }; /** * Custom implementation of randomatic pattern-based string generator * Pattern characters: * A - Uppercase letter * a - Lowercase letter * 0 - Number (0-9) * ! - Special character * * - Any character (A, a, 0, or !) */ const customRandomatic = (pattern: string, length?: number, options?: any): string => { const charSets = { 'A': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'a': 'abcdefghijklmnopqrstuvwxyz', '0': '0123456789', '!': '!@#$%^&*()_+-=[]{}|;:,.<>?', '*': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;:,.<>?' }; // If length is provided, repeat the pattern to match length let actualPattern = pattern; if (length && length > pattern.length) { actualPattern = pattern.repeat(Math.ceil(length / pattern.length)).slice(0, length); } else if (length) { actualPattern = pattern.slice(0, length); } let result = ''; for (const char of actualPattern) { if (charSets[char]) { const charSet = charSets[char]; const randomIndex = getRandomInt(0, charSet.length); result += charSet[randomIndex]; } else { // If not a pattern character, use it literally result += char; } } return result; }; /** * creates a random string * * ```ts * createRandomString('AAAA') * //=> 'AGHR' * ``` * * @param patternArg the pattern argument to use, Aa0!* are viable pattern descritors * @param lengthArg the length of the random string * @param optionsArg options */ export const createRandomString = ( patternArg: string, lengthArg?: number, optionsArg?: any ): string => { return customRandomatic(patternArg, lengthArg, optionsArg); }; /** * creates a crytic string in the speicifed length * @param lengthArg the length of the crypto string */ export const createCryptoRandomString = (): string => { return plugins.isounique.uni(); };