import getActiveRandomPasswordContent from './helpers/getActiveRandomPasswordContent' import getIterableArrayByNumber from './helpers/getIterableArrayByNumber' import getPasswordContent from './helpers/getPasswordContent' interface PasswordGenerator { isUpperCase?: boolean isLowerCase?: boolean isNumber?: boolean isSymbol?: boolean maxLength: number } export const passwordGenerator = ({ isUpperCase = false, isLowerCase = false, isNumber = false, isSymbol = false, maxLength }: PasswordGenerator): string => { const isAtleastOneOfContent = isUpperCase || isLowerCase || isNumber || isSymbol const isMaxLength_Or_IsAtleastOneOfContent = maxLength || isAtleastOneOfContent const isMaxLength_And_IsAtleastOneOfContent = maxLength && isAtleastOneOfContent if (!isMaxLength_Or_IsAtleastOneOfContent || !isMaxLength_And_IsAtleastOneOfContent) throw Error('Could not generate the password. Please check the params!') const passwordLength = getIterableArrayByNumber(maxLength) return passwordLength.reduce((acc: string) => { const upperCase = isUpperCase && acc + getPasswordContent.upperCase() const lowerCase = isLowerCase && acc + getPasswordContent.lowerCase() const number = isNumber && acc + getPasswordContent.number() const symbol = isSymbol && acc + getPasswordContent.symbol() const containerValue = getActiveRandomPasswordContent([upperCase, lowerCase, number, symbol]) return containerValue || acc }, '') } export default passwordGenerator