{"version":3,"file":"complexity-DydNJOmy.mjs","names":["specialCharsRegex: RegExp"],"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,IAAIA;AACJ,KAAI,OAAO,4BAA4B;EAErC,IAAI,UAAU,OAAO,2BAA2B,QAAQ,KAAK,MAAM;AACnE,YAAU,QAAQ,QAAQ,KAAK,MAAM;AACrC,sCAAoB,IAAI,OAAO,IAAI,QAAQ,GAAG;OAE9C,qBAAoB;AAGtB,SACE,UACA,EACE,WACA,gBAKC;AACH,SAAO;GACL,YAAY,SAAS,SAAS;GAC9B,YAAY,SAAS,UAAU;GAC/B,iBAAiB,KAAK,KAAK,SAAS;GACpC,mBAAmB,QAAQ,KAAK,SAAS;GACzC,mBAAmB,QAAQ,KAAK,SAAS;GACzC,sBAAsB,kBAAkB,KAAK,SAAS;GACvD;;;AAIL,MAAa,YAAY,UAAkB,WAA0D;CACnG,MAAM,EAAE,YAAY,YAAY,sBAAsB,mBAAmB,iBAAiB,sBACxF;CAEF,MAAM,YADsB,0BAA0B,OAAO,CACvB,UAAU;EAC9C,WAAW,OAAO;EAClB,WAAW,OAAO;EACnB,CAAC;CAEF,MAAM,OAAO;EACX;EACA;EACA;EACA;EACA;EACA;EACD;CAED,MAAM,wCAAwB,IAAI,KAAK;AACvC,MAAK,MAAM,KAAK,MAAM;EACpB,MAAM,MAAM;AAEZ,MAAI,CAAC,KAAK,KACR;AAGF,MAAI,CAAC,UAAU,KACb,uBAAsB,IAAI,KAAK,KAAK;;AAIxC,QAAO,OAAO,OAAO,OAAO,YAAY,sBAAsB,CAAC;;AAGjE,MAAa,4BAA4B,WAAwC;AAC/E,SAAQ,aAAqB,SAAS,UAAU,OAAO"}