aboutsummaryrefslogtreecommitdiffstats
path: root/src/helpers
diff options
context:
space:
mode:
authorLibravatar Stefan Malzner <stefan@adlk.io>2017-10-13 12:29:40 +0200
committerLibravatar Stefan Malzner <stefan@adlk.io>2017-10-13 12:29:40 +0200
commit58cda9cc7fb79ca9df6746de7f9662bc08dc156a (patch)
tree1211600c2a5d3b5f81c435c6896618111a611720 /src/helpers
downloadferdium-app-58cda9cc7fb79ca9df6746de7f9662bc08dc156a.tar.gz
ferdium-app-58cda9cc7fb79ca9df6746de7f9662bc08dc156a.tar.zst
ferdium-app-58cda9cc7fb79ca9df6746de7f9662bc08dc156a.zip
initial commit
Diffstat (limited to 'src/helpers')
-rw-r--r--src/helpers/password-helpers.js36
-rw-r--r--src/helpers/recipe-helpers.js39
-rw-r--r--src/helpers/routing-helpers.js4
-rw-r--r--src/helpers/validation-helpers.js48
-rw-r--r--src/helpers/webview-ime-focus-helpers.js38
5 files changed, 165 insertions, 0 deletions
diff --git a/src/helpers/password-helpers.js b/src/helpers/password-helpers.js
new file mode 100644
index 000000000..7aacaa4d0
--- /dev/null
+++ b/src/helpers/password-helpers.js
@@ -0,0 +1,36 @@
1import { SHA256 } from 'jshashes';
2
3export function hash(password) {
4 return new SHA256().b64(password);
5}
6
7export function scorePassword(password) {
8 let score = 0;
9 if (!password) {
10 return score;
11 }
12
13 // award every unique letter until 5 repetitions
14 const letters = {};
15 for (let i = 0; i < password.length; i += 1) {
16 letters[password[i]] = (letters[password[i]] || 0) + 1;
17 score += 5.0 / letters[password[i]];
18 }
19
20 // bonus points for mixing it up
21 const variations = {
22 digits: /\d/.test(password),
23 lower: /[a-z]/.test(password),
24 upper: /[A-Z]/.test(password),
25 nonWords: /\W/.test(password),
26 };
27
28 let variationCount = 0;
29 Object.keys(variations).forEach((key) => {
30 variationCount += (variations[key] === true) ? 1 : 0;
31 });
32
33 score += (variationCount - 1) * 10;
34
35 return parseInt(score, 10);
36}
diff --git a/src/helpers/recipe-helpers.js b/src/helpers/recipe-helpers.js
new file mode 100644
index 000000000..257e322fb
--- /dev/null
+++ b/src/helpers/recipe-helpers.js
@@ -0,0 +1,39 @@
1import path from 'path';
2import { remote } from 'electron';
3
4// import ServiceModel from '../models/Service';
5
6const app = remote.app;
7
8export function getRecipeDirectory(id = '') {
9 return path.join(app.getPath('userData'), 'recipes', id);
10}
11
12export function getDevRecipeDirectory(id = '') {
13 return path.join(app.getPath('userData'), 'recipes', 'dev', id);
14}
15
16export function loadRecipeConfig(recipeId) {
17 try {
18 const configPath = `${recipeId}/package.json`;
19 // Delete module from cache
20 delete require.cache[require.resolve(configPath)];
21
22 // eslint-disable-next-line
23 let config = require(configPath);
24
25 const moduleConfigPath = require.resolve(configPath);
26 const paths = path.parse(moduleConfigPath);
27 config.path = paths.dir;
28
29 return config;
30 } catch (e) {
31 console.error(e);
32 return null;
33 }
34}
35
36module.paths.unshift(
37 getDevRecipeDirectory(),
38 getRecipeDirectory(),
39);
diff --git a/src/helpers/routing-helpers.js b/src/helpers/routing-helpers.js
new file mode 100644
index 000000000..14922ebf3
--- /dev/null
+++ b/src/helpers/routing-helpers.js
@@ -0,0 +1,4 @@
1import RouteParser from 'route-parser';
2
3// eslint-disable-next-line
4export const matchRoute = (pattern, path) => new RouteParser(pattern).match(path);
diff --git a/src/helpers/validation-helpers.js b/src/helpers/validation-helpers.js
new file mode 100644
index 000000000..eeb12cab7
--- /dev/null
+++ b/src/helpers/validation-helpers.js
@@ -0,0 +1,48 @@
1export function required({ field }) {
2 const isValid = (field.value.trim() !== '');
3 return [isValid, `${field.label} is required`];
4}
5
6export function email({ field }) {
7 const value = field.value.trim();
8 let isValid = false;
9
10 if (value !== '') {
11 isValid = Boolean(value.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63}/i));
12 } else {
13 isValid = true;
14 }
15
16 return [isValid, `${field.label} is not a valid email address`];
17}
18
19export function url({ field }) {
20 const value = field.value.trim();
21 let isValid = false;
22
23 if (value !== '') {
24 // eslint-disable-next-line
25 isValid = Boolean(value.match(/(^|[\s.:;?\-\]<(])(https?:\/\/[-\w;/?:@&=+$|_.!~*|'()[\]%#,☺]+[\w/#](\(\))?)(?=$|[\s',|().:;?\-[\]>)])/i));
26 } else {
27 isValid = true;
28 }
29
30 return [isValid, `${field.label} is not a valid url`];
31}
32
33export function minLength(length) {
34 return ({ field }) => {
35 let isValid = true;
36 if (field.touched) {
37 isValid = field.value.length >= length;
38 }
39 return [isValid, `${field.label} should be at least ${length} characters long.`];
40 };
41}
42
43export function oneRequired(targets) {
44 return ({ field, form }) => {
45 const invalidFields = targets.filter(target => form.$(target).value === '');
46 return [targets.length !== invalidFields.length, `${field.label} is required`];
47 };
48}
diff --git a/src/helpers/webview-ime-focus-helpers.js b/src/helpers/webview-ime-focus-helpers.js
new file mode 100644
index 000000000..2593a5f26
--- /dev/null
+++ b/src/helpers/webview-ime-focus-helpers.js
@@ -0,0 +1,38 @@
1module.exports.releaseDocumentFocus = () => {
2 const element = document.createElement('span');
3 document.body.appendChild(element);
4
5 const range = document.createRange();
6 range.setStart(element, 0);
7
8 const selection = window.getSelection();
9 selection.removeAllRanges();
10 selection.addRange(range);
11 selection.removeAllRanges();
12
13 document.body.removeChild(element);
14};
15
16module.exports.claimDocumentFocus = () => {
17 const { activeElement } = document;
18 const selection = window.getSelection();
19
20 let selectionStart;
21 let selectionEnd;
22 let range;
23
24 if (activeElement) ({ selectionStart, selectionEnd } = activeElement);
25 if (selection.rangeCount) range = selection.getRangeAt(0);
26
27 const restoreOriginalSelection = () => {
28 if (selectionStart >= 0 && selectionEnd >= 0) {
29 activeElement.selectionStart = selectionStart;
30 activeElement.selectionEnd = selectionEnd;
31 } else if (range) {
32 selection.addRange(range);
33 }
34 };
35
36 exports.releaseDocumentFocus();
37 window.requestAnimationFrame(restoreOriginalSelection);
38};