|
const {Success, Failure} = require( 'folktale/validation'); |
|
const R = require('ramda'); |
|
|
|
const isRequired = (form, field) => !!form[field].trim() |
|
? Success([]) |
|
: Failure(["This field is required"]) |
|
|
|
const isEmail = (form, field) => /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(form[field]) |
|
? Success([]) |
|
: Failure([`${form[field]} doesn't seem to be an email`]) |
|
|
|
const isConfirmed = (fieldToConfirm, what) => (form, confirmField) => form[fieldToConfirm] === form[confirmField] |
|
? Success([]) |
|
: Failure([`${what} don't match`]) |
|
|
|
const mapEntries = require('folktale/core/object/map-entries') |
|
|
|
const validate = (form, rules) => mapEntries( |
|
rules, |
|
([field, fieldRules]) => { |
|
|
|
const possibleIssues = fieldRules.map(r => r(form, field)) |
|
.reduce(R.concat, Success()) |
|
.matchWith({ |
|
Success: ({ value }) => value, |
|
Failure: ({ value }) => value |
|
}) |
|
return [ |
|
field, |
|
possibleIssues |
|
] |
|
}, |
|
(result, key, value) => R.assoc(key, value, result) |
|
) |
|
|
|
const form = { |
|
username: 'Jernej', |
|
email: 'jernej.sila@gmail', |
|
password: 'pass', |
|
password_confirmation: '' |
|
} |
|
|
|
const rules = { |
|
username: [isRequired], |
|
email: [isRequired, isEmail], |
|
password: [isRequired], |
|
password_confirmation: [isRequired, isConfirmed('password', 'Passwords')] |
|
} |
|
|
|
const errors = validate(form, rules) |