UNPKG

ajv-formats-strong-password

Version:

Easy way to add configurable strong password format to ajv to use in schema validations

61 lines (60 loc) 2.02 kB
// src/addStrongPasswordFormat.ts var defaultUpperCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var defaultLowerCharacters = "abcdefghijklmnopqrstuvwxyz"; var defaultDigitCharacters = "0123456789"; var defaultSpecialCharacters = " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; var countCharacters = (str, characters) => { let count = 0; for (let i = 0; i < str.length; i++) { if (characters.includes(str[i])) { count++; } } return count; }; var generatePasswordStrengthValidator = ({ minUpper = 0, minLower = 0, minDigit = 0, minSpecial = 0, minLength = 0, upperCharacters = defaultUpperCharacters, lowerCharacters = defaultLowerCharacters, digitCharacters = defaultDigitCharacters, specialCharacters = defaultSpecialCharacters } = {}) => { return (password) => { const effectiveMinLength = Math.max( minUpper + minSpecial + minDigit + minLower, minLength ); const hasMinUpper = countCharacters(password, upperCharacters) >= minUpper; const hasMinLower = countCharacters(password, lowerCharacters) >= minLower; const hasMinDigit = countCharacters(password, digitCharacters) >= minDigit; const hasMinSpecial = countCharacters(password, specialCharacters) >= minSpecial; const hasMinLength = password.length >= effectiveMinLength; const isStrongPassword = hasMinUpper && hasMinLower && hasMinDigit && hasMinSpecial && hasMinLength; return isStrongPassword; }; }; var addStrongPasswordFormat = ({ ajvInstance, passwordCriteria }) => { const generatedPasswordStrengthValidator = generatePasswordStrengthValidator(passwordCriteria); ajvInstance.addFormat("strong-password", { type: "string", validate: (x) => generatedPasswordStrengthValidator(x) }); }; // src/index.ts var src_default = addStrongPasswordFormat; export { src_default as default, defaultDigitCharacters, defaultLowerCharacters, defaultSpecialCharacters, defaultUpperCharacters, generatePasswordStrengthValidator }; //# sourceMappingURL=index.mjs.map