ajv-formats-strong-password
Version:
Easy way to add configurable strong password format to ajv to use in schema validations
1 lines • 4.45 kB
Source Map (JSON)
{"version":3,"sources":["../src/addStrongPasswordFormat.ts","../src/index.ts"],"sourcesContent":["import Ajv from \"ajv\";\r\n\r\nexport type GeneratePasswordStrengthValidatorOptions = {\r\n minUpper?: number;\r\n upperCharacters?: string;\r\n minLower?: number;\r\n lowerCharacters?: string;\r\n minDigit?: number;\r\n digitCharacters?: string;\r\n minSpecial?: number;\r\n specialCharacters?: string;\r\n minLength?: number;\r\n};\r\n\r\n// Define character sets\r\nexport const defaultUpperCharacters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\r\nexport const defaultLowerCharacters = \"abcdefghijklmnopqrstuvwxyz\";\r\nexport const defaultDigitCharacters = \"0123456789\";\r\nexport const defaultSpecialCharacters = \" !\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~\"; // as defined by OWASP https://owasp.org/www-community/password-special-characters\r\n\r\n// Count the occurrences of characters in a string\r\nconst countCharacters = (str: string, characters: string): number => {\r\n let count = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n if (characters.includes(str[i])) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n};\r\n\r\nexport const generatePasswordStrengthValidator = ({\r\n minUpper = 0,\r\n minLower = 0,\r\n minDigit = 0,\r\n minSpecial = 0,\r\n minLength = 0,\r\n upperCharacters = defaultUpperCharacters,\r\n lowerCharacters = defaultLowerCharacters,\r\n digitCharacters = defaultDigitCharacters,\r\n specialCharacters = defaultSpecialCharacters,\r\n}: GeneratePasswordStrengthValidatorOptions = {}) => {\r\n return (password: string) => {\r\n const effectiveMinLength = Math.max(\r\n minUpper + minSpecial + minDigit + minLower,\r\n minLength\r\n );\r\n\r\n // Check if the password meets the criteria\r\n const hasMinUpper = countCharacters(password, upperCharacters) >= minUpper;\r\n const hasMinLower = countCharacters(password, lowerCharacters) >= minLower;\r\n const hasMinDigit = countCharacters(password, digitCharacters) >= minDigit;\r\n const hasMinSpecial =\r\n countCharacters(password, specialCharacters) >= minSpecial;\r\n const hasMinLength = password.length >= effectiveMinLength;\r\n\r\n // Check if the password meets all criteria\r\n const isStrongPassword =\r\n hasMinUpper &&\r\n hasMinLower &&\r\n hasMinDigit &&\r\n hasMinSpecial &&\r\n hasMinLength;\r\n\r\n return isStrongPassword;\r\n };\r\n};\r\n\r\ntype AddStrongPasswordFormatParams = {\r\n ajvInstance: Ajv;\r\n passwordCriteria: GeneratePasswordStrengthValidatorOptions;\r\n};\r\nexport const addStrongPasswordFormat = ({\r\n ajvInstance,\r\n passwordCriteria,\r\n}: AddStrongPasswordFormatParams): void => {\r\n const generatedPasswordStrengthValidator =\r\n generatePasswordStrengthValidator(passwordCriteria);\r\n ajvInstance.addFormat(\"strong-password\", {\r\n type: \"string\",\r\n validate: (x) => generatedPasswordStrengthValidator(x),\r\n });\r\n};\r\n","import {\r\n addStrongPasswordFormat,\r\n defaultUpperCharacters,\r\n defaultLowerCharacters,\r\n defaultDigitCharacters,\r\n defaultSpecialCharacters,\r\n generatePasswordStrengthValidator,\r\n} from \"./addStrongPasswordFormat\";\r\n\r\nexport default addStrongPasswordFormat;\r\nexport {\r\n defaultUpperCharacters,\r\n defaultLowerCharacters,\r\n defaultDigitCharacters,\r\n defaultSpecialCharacters,\r\n generatePasswordStrengthValidator,\r\n};\r\n"],"mappings":";AAeO,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAC/B,IAAM,2BAA2B;AAGxC,IAAM,kBAAkB,CAAC,KAAa,eAA+B;AACnE,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,QAAI,WAAW,SAAS,IAAI,CAAC,CAAC,GAAG;AAC/B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,oCAAoC,CAAC;AAAA,EAChD,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AACtB,IAA8C,CAAC,MAAM;AACnD,SAAO,CAAC,aAAqB;AAC3B,UAAM,qBAAqB,KAAK;AAAA,MAC9B,WAAW,aAAa,WAAW;AAAA,MACnC;AAAA,IACF;AAGA,UAAM,cAAc,gBAAgB,UAAU,eAAe,KAAK;AAClE,UAAM,cAAc,gBAAgB,UAAU,eAAe,KAAK;AAClE,UAAM,cAAc,gBAAgB,UAAU,eAAe,KAAK;AAClE,UAAM,gBACJ,gBAAgB,UAAU,iBAAiB,KAAK;AAClD,UAAM,eAAe,SAAS,UAAU;AAGxC,UAAM,mBACJ,eACA,eACA,eACA,iBACA;AAEF,WAAO;AAAA,EACT;AACF;AAMO,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AACF,MAA2C;AACzC,QAAM,qCACJ,kCAAkC,gBAAgB;AACpD,cAAY,UAAU,mBAAmB;AAAA,IACvC,MAAM;AAAA,IACN,UAAU,CAAC,MAAM,mCAAmC,CAAC;AAAA,EACvD,CAAC;AACH;;;ACzEA,IAAO,cAAQ;","names":[]}