@clerk/shared
Version:
Internal package utils used by the Clerk SDKs
1 lines • 3.45 kB
Source Map (JSON)
{"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"}