@shaaditech/react-cc-validator
Version:
Credit/Debit card number validation library with input formatting
61 lines (48 loc) • 1.63 kB
JavaScript
import cardValidator from 'card-validator';
// Maybe :: A -> Maybe<A>
export const Maybe = x => ({
map: f => (x ? Maybe.Just(f(x)) : Maybe.Nothing(x)),
// chain: f => x? f(x): Maybe.Nothing(x),
});
// Just :: A -> Just<A>
Maybe.Just = x => ({
map: f => Maybe.Just(f(x)),
// fold: f => f(x),
cata: ({ Just: f }) => f(x),
});
// Nothing :: () -> Nothing
Maybe.Nothing = x => ({
map: () => Maybe.Nothing(x),
// fold: () => Maybe.Nothing(x),
cata: ({ Nothing: f }) => f(x),
});
// log :: String -> A -> A
// export const log = prefix => x => {
// console.log(prefix, x); // eslint-disable-line
// return x;
// };
// identity :: A -> A
export const identity = x => x;
// isInArray :: Array<A> -> A -> Boolean
export const isInArray = arr => el =>
arr.indexOf(el) !== -1;
// propOr :: (String, A) -> Object<String, A> -> A
export const propOr = (propname, defaultVal) => obj =>
obj? obj[propname]: defaultVal;
// validateCardNumber :: CardNumber -> ValidationResult
export const validateCardNumber = cardValidator.number;
// cond :: (Boolean, Array<A -> B>) -> A -> B
export const cond = (condition, [ onTrue, onFalse ]) => value =>
condition? onTrue(value): onFalse(value);
// validateCardType :: ValidationResult -> ValidationResult
export const validateCardType = validTypes => result => {
result = { ...result, isCardNumberValid: result.isValid };
return Maybe(result.isValid && !!validTypes.length)
.map(() => result.card)
.map(propOr('type', ''))
.map(isInArray(validTypes))
.cata({
Just: isValid => ({ ...result, isValid }),
Nothing: () => result,
});
};