aboutsummaryrefslogtreecommitdiffstats
path: root/packages/forms/src/input/scorePassword.ts
diff options
context:
space:
mode:
authorLibravatar Stefan Malzner <stefan@adlk.io>2019-01-03 16:46:47 +0100
committerLibravatar Stefan Malzner <stefan@adlk.io>2019-01-03 16:46:47 +0100
commit3fa0b0439c7dc49ffb2c4aff89e5a0f96aacf5e2 (patch)
tree450b9e21d0bfac2cdde28995a04a3643b3ea2a37 /packages/forms/src/input/scorePassword.ts
parentAdd theme (diff)
downloadferdium-app-3fa0b0439c7dc49ffb2c4aff89e5a0f96aacf5e2.tar.gz
ferdium-app-3fa0b0439c7dc49ffb2c4aff89e5a0f96aacf5e2.tar.zst
ferdium-app-3fa0b0439c7dc49ffb2c4aff89e5a0f96aacf5e2.zip
Add forms
Diffstat (limited to 'packages/forms/src/input/scorePassword.ts')
-rw-r--r--packages/forms/src/input/scorePassword.ts42
1 files changed, 42 insertions, 0 deletions
diff --git a/packages/forms/src/input/scorePassword.ts b/packages/forms/src/input/scorePassword.ts
new file mode 100644
index 000000000..bdad7aa28
--- /dev/null
+++ b/packages/forms/src/input/scorePassword.ts
@@ -0,0 +1,42 @@
1interface ILetters {
2 [key: string]: number;
3}
4
5interface IVariations {
6 [index: string]: boolean;
7 digits: boolean;
8 lower: boolean;
9 nonWords: boolean;
10 upper: boolean;
11}
12
13export default function scorePasswordFunc(password: string): number {
14 let score: number = 0;
15 if (!password) {
16 return score;
17 }
18
19 // award every unique letter until 5 repetitions
20 const letters: ILetters = {};
21 for (let i = 0; i < password.length; i += 1) {
22 letters[password[i]] = (letters[password[i]] || 0) + 1;
23 score += 5.0 / letters[password[i]];
24 }
25
26 // bonus points for mixing it up
27 const variations: IVariations = {
28 digits: /\d/.test(password),
29 lower: /[a-z]/.test(password),
30 nonWords: /\W/.test(password),
31 upper: /[A-Z]/.test(password),
32 };
33
34 let variationCount = 0;
35 Object.keys(variations).forEach((key) => {
36 variationCount += (variations[key] === true) ? 1 : 0;
37 });
38
39 score += (variationCount - 1) * 10;
40
41 return Math.round(score);
42}