{"version":3,"file":"complexity.mjs","names":[],"sources":["../../../../src/internal/clerk-js/passwords/complexity.ts"],"sourcesContent":["import type { PasswordSettingsData } from '@/types';\n\nexport type ComplexityErrors = {\n  [key in keyof Partial<Omit<PasswordSettingsData, 'disable_hibp' | 'min_zxcvbn_strength' | 'show_zxcvbn'>>]?: boolean;\n};\n\nexport type UsePasswordComplexityConfig = Omit<\n  PasswordSettingsData,\n  'disable_hibp' | 'min_zxcvbn_strength' | 'show_zxcvbn'\n>;\n\nconst createTestComplexityCases = (config: Pick<UsePasswordComplexityConfig, 'allowed_special_characters'>) => {\n  let specialCharsRegex: RegExp;\n  if (config.allowed_special_characters) {\n    // Avoid a nested group by escaping the `[]` characters\n    let escaped = config.allowed_special_characters.replace('[', '\\\\[');\n    escaped = escaped.replace(']', '\\\\]');\n    specialCharsRegex = new RegExp(`[${escaped}]`);\n  } else {\n    specialCharsRegex = /[!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/;\n  }\n\n  return (\n    password: string,\n    {\n      minLength,\n      maxLength,\n    }: {\n      minLength: number;\n      maxLength: number;\n    },\n  ) => {\n    return {\n      max_length: password.length < maxLength,\n      min_length: password.length >= minLength,\n      require_numbers: /\\d/.test(password),\n      require_lowercase: /[a-z]/.test(password),\n      require_uppercase: /[A-Z]/.test(password),\n      require_special_char: specialCharsRegex.test(password),\n    };\n  };\n};\n\nexport const validate = (password: string, config: UsePasswordComplexityConfig): ComplexityErrors => {\n  const { max_length, min_length, require_special_char, require_lowercase, require_numbers, require_uppercase } =\n    config;\n  const testComplexityCases = createTestComplexityCases(config);\n  const testCases = testComplexityCases(password, {\n    maxLength: config.max_length,\n    minLength: config.min_length,\n  });\n\n  const keys = {\n    max_length,\n    min_length,\n    require_special_char,\n    require_lowercase,\n    require_numbers,\n    require_uppercase,\n  };\n\n  const _validationsFailedMap = new Map();\n  for (const k in keys) {\n    const key = k as keyof typeof keys;\n\n    if (!keys[key]) {\n      continue;\n    }\n\n    if (!testCases[key]) {\n      _validationsFailedMap.set(key, true);\n    }\n  }\n\n  return Object.freeze(Object.fromEntries(_validationsFailedMap));\n};\n\nexport const createValidateComplexity = (config: UsePasswordComplexityConfig) => {\n  return (password: string) => validate(password, config);\n};\n"],"mappings":";AAWA,MAAM,6BAA6B,WAA4E;CAC7G,IAAI;CACJ,IAAI,OAAO,4BAA4B;EAErC,IAAI,UAAU,OAAO,2BAA2B,QAAQ,KAAK,KAAK;EAClE,UAAU,QAAQ,QAAQ,KAAK,KAAK;EACpC,oBAAoB,IAAI,OAAO,IAAI,QAAQ,EAAE;CAC/C,OACE,oBAAoB;CAGtB,QACE,UACA,EACE,WACA,gBAKC;EACH,OAAO;GACL,YAAY,SAAS,SAAS;GAC9B,YAAY,SAAS,UAAU;GAC/B,iBAAiB,KAAK,KAAK,QAAQ;GACnC,mBAAmB,QAAQ,KAAK,QAAQ;GACxC,mBAAmB,QAAQ,KAAK,QAAQ;GACxC,sBAAsB,kBAAkB,KAAK,QAAQ;EACvD;CACF;AACF;AAEA,MAAa,YAAY,UAAkB,WAA0D;CACnG,MAAM,EAAE,YAAY,YAAY,sBAAsB,mBAAmB,iBAAiB,sBACxF;CAEF,MAAM,YADsB,0BAA0B,MAClB,CAAC,CAAC,UAAU;EAC9C,WAAW,OAAO;EAClB,WAAW,OAAO;CACpB,CAAC;CAED,MAAM,OAAO;EACX;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,MAAM,wCAAwB,IAAI,IAAI;CACtC,KAAK,MAAM,KAAK,MAAM;EACpB,MAAM,MAAM;EAEZ,IAAI,CAAC,KAAK,MACR;EAGF,IAAI,CAAC,UAAU,MACb,sBAAsB,IAAI,KAAK,IAAI;CAEvC;CAEA,OAAO,OAAO,OAAO,OAAO,YAAY,qBAAqB,CAAC;AAChE;AAEA,MAAa,4BAA4B,WAAwC;CAC/E,QAAQ,aAAqB,SAAS,UAAU,MAAM;AACxD"}