Skip to content

Commit

Permalink
Unify definition of empty value; Clean up validation rules (#402)
Browse files Browse the repository at this point in the history
  • Loading branch information
rkuykendall committed Feb 18, 2020
1 parent 05bea58 commit 465fd21
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 81 deletions.
6 changes: 2 additions & 4 deletions src/Wrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
WrappedComponentClass,
} from './interfaces';
import { isString } from './utils';
import { isDefaultRequiredValue } from './validationRules';

/* eslint-disable react/default-props-match-prop-types */

Expand Down Expand Up @@ -243,10 +244,7 @@ export default function<T, V>(
// eslint-disable-next-line react/destructuring-assignment
public hasValue = () => {
const { value } = this.state;
if (isString(value)) {
return value !== '';
}
return value !== undefined;
return isDefaultRequiredValue(value);
};

// eslint-disable-next-line react/destructuring-assignment
Expand Down
124 changes: 47 additions & 77 deletions src/validationRules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,96 +8,66 @@ import {
isValueUndefined,
} from './utils';

const isExisty = <V>(value: V) => !isValueNullOrUndefined(value);
const isEmpty = <V>(value: V) => {
export function isExisty<V>(value: V) {
return !isValueNullOrUndefined(value);
}

export function isEmpty<V>(value: V) {
if (isString(value)) {
return isValueStringEmpty(value);
}
if (isTypeUndefined(value)) {
return false;
}
return isValueUndefined(value);
};
}

export function isDefaultRequiredValue(value: unknown) {
return isString(value) ? isValueStringEmpty(value) : isValueNullOrUndefined(value);
}

export function matchRegexp<V>(_values: Values, value: V, regexp: RegExp) {
return !isExisty(value) || isEmpty(value) || regexp.test(`${value}`);
}

interface Validations<V> {
[key: string]: ValidationFunction<V>;
}

const REGEX_PATTERNS = {
ALPHA: /^[A-Z]+$/i,
ALPHANUMERIC: /^[0-9A-Z]+$/i,
EMAIL: /^(([^<>()[\]\\.,;:\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,}))$/i, // from http://emailregex.com/
FLOAT: /^(?:[-+]?(?:\d+))?(?:\.\d*)?(?:[eE][+-]?(?:\d+))?$/,
INT: /^(?:[-+]?(?:0|[1-9]\d*))$/,
NUMERIC: /^[-+]?(?:\d*[.])?\d+$/,
SPECIAL_WORDS: /^[\sA-ZÀ-ÖØ-öø-ÿ]+$/i,
URL: /^(?:\w+:)?\/\/([^\s.]+\.\S{2}|localhost[:?\d]*)\S*$/i,
WORDS: /^[A-Z\s]+$/i,
};

const validations: Validations<any> = {
isDefaultRequiredValue<V>(_values: Values, value: V) {
if (isString(value)) {
return isValueStringEmpty(value);
}
return isValueNullOrUndefined(value);
},
isExisty<V>(_values: Values, value: V) {
return isExisty(value);
},
matchRegexp(_values: Values, value: string, regexp: RegExp) {
return !isExisty(value) || isEmpty(value) || regexp.test(value);
},
isUndefined<V>(_values: Values, value: V) {
return isValueUndefined(value);
},
isEmptyString(_values: Values, value: string) {
return isEmpty(value);
},
isEmail(values: Values, value: string) {
// Regex from http://emailregex.com/
return validations.matchRegexp(
values,
value,
/^(([^<>()[\]\\.,;:\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,}))$/i,
);
},
isUrl<V>(values: Values, value: V) {
return validations.matchRegexp(values, value, /^(?:\w+:)?\/\/([^\s.]+\.\S{2}|localhost[:?\d]*)\S*$/i);
},
isTrue(_values: Values, value: boolean | string) {
return value === true;
},
isFalse(_values: Values, value: boolean | string) {
return value === false;
},
isNumeric<V>(values: Values, value: V) {
if (isNumber(value)) {
return true;
}
return validations.matchRegexp(values, value, /^[-+]?(?:\d*[.])?\d+$/);
},
isAlpha<V>(values: Values, value: V) {
return validations.matchRegexp(values, value, /^[A-Z]+$/i);
},
isAlphanumeric<V>(values: Values, value: V) {
return validations.matchRegexp(values, value, /^[0-9A-Z]+$/i);
},
isInt<V>(values: Values, value: V) {
return validations.matchRegexp(values, value, /^(?:[-+]?(?:0|[1-9]\d*))$/);
},
isFloat<V>(values: Values, value: V) {
return validations.matchRegexp(values, value, /^(?:[-+]?(?:\d+))?(?:\.\d*)?(?:[eE][+-]?(?:\d+))?$/);
},
isWords<V>(values: Values, value: V) {
return validations.matchRegexp(values, value, /^[A-Z\s]+$/i);
},
isSpecialWords<V>(values: Values, value: V) {
return validations.matchRegexp(values, value, /^[\sA-ZÀ-ÖØ-öø-ÿ]+$/i);
},
isLength(_values: Values, value: string, length: number) {
return !isExisty(value) || isEmpty(value) || value.length === length;
},
equals<V>(_values: Values, value: V, eql: V) {
return !isExisty(value) || isEmpty(value) || value === eql;
},
equalsField<V>(values: Values, value: V, field: string) {
return value === values[field];
},
maxLength(_values: Values, value: string, length: number) {
return !isExisty(value) || value.length <= length;
},
minLength(_values: Values, value: string, length: number) {
return !isExisty(value) || isEmpty(value) || value.length >= length;
},
equals: <V>(_values, value: V, eql: V) => !isExisty(value) || isEmpty(value) || value === eql,
equalsField: <V>(values, value: V, field: string) => value === values[field],
isAlpha: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.ALPHA),
isAlphanumeric: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.ALPHANUMERIC),
isDefaultRequiredValue: <V>(values, value: V) => isDefaultRequiredValue(value),
isEmail: (values, value: string) => matchRegexp(values, value, REGEX_PATTERNS.EMAIL),
isEmptyString: (_values, value: string) => isEmpty(value),
isExisty: <V>(_values, value: V) => isExisty(value),
isFalse: (_values, value: boolean | string) => value === false,
isFloat: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.FLOAT),
isInt: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.INT),
isLength: (_values, value: string, length: number) => !isExisty(value) || isEmpty(value) || value.length === length,
isNumeric: <V>(values, value: V) => isNumber(value) || matchRegexp(values, value, REGEX_PATTERNS.NUMERIC),
isSpecialWords: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.SPECIAL_WORDS),
isTrue: (_values, value: boolean | string) => value === true,
isUndefined: <V>(_values, value: V) => isValueUndefined(value),
isUrl: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.URL),
isWords: <V>(values, value: V) => matchRegexp(values, value, REGEX_PATTERNS.WORDS),
matchRegexp,
maxLength: (_values, value: string, length: number) => !isExisty(value) || value.length <= length,
minLength: (_values, value: string, length: number) => !isExisty(value) || isEmpty(value) || value.length >= length,
};

export default validations;

0 comments on commit 465fd21

Please sign in to comment.