{"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":[]}