create-bar-project
Version:
This module helps create a base for web application projects.
99 lines (82 loc) • 3.16 kB
text/typescript
import * as Yup from 'yup';
// https://www.npmjs.com/package/yup
const FILE_SIZE = 1600 * 1024;
const SUPPORTED_FORMATS = ['*/image', '/*video', 'text/plain'];
const requiredMessage = 'Required';
const emailMessage = 'Email must be like this a@a.com';
const phoneMessage = 'Phone not good';
const nameTooLongMessage = 'Name too long';
const textTooLongMessage = 'Text too long';
const fileSizeTooLarge = 'File/s Size is too large';
const fileTypeNotSupported = 'Unsupported File Format';
const checkboxMessage = 'Must Check This';
const passwordMessage = 'min 8 letters, max 14, must contain at least one capital letter and one small letter ';
const emailRegex = /^[^<>()[\]\\,;:#^\s@$&!@]+@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z0-9]+\.)+[a-zA-Z]{2,})|(([a-zA-Z0-9]+[-]+[a-zA-Z0-9]+\.)+[a-zA-Z]{2,})+((\.{0,1})+[a-zA-Z]{2,}){0,1})+$/;
const requiredYup = Yup.string().required(requiredMessage);
const emailYup = Yup.string()
.required(requiredMessage)
.test('email', emailMessage, (value) => !value || emailRegex.test(value));
const nameYup = Yup.string().required(requiredMessage).max(20, nameTooLongMessage);
const textYup = Yup.string().required(requiredMessage).max(500, textTooLongMessage);
const phoneRequiredYup = Yup.string()
.required(requiredMessage)
.test('phone', phoneMessage, (value) => !value || (/^[0-9]+$/i.test(value) && value.length === 10));
const filesYup = Yup.mixed()
.test('fileSize', fileSizeTooLarge, (value) => {
if (value) {
let finalSize = 0;
Array.from(value).forEach((v: any) => {
finalSize += v.size;
});
return finalSize <= FILE_SIZE;
}
return true;
})
.test('fileType', fileTypeNotSupported, (value) => {
if (value) {
let typeFlag = true;
Array.from(value).forEach((v: any) => {
if (typeFlag) {
typeFlag = SUPPORTED_FORMATS.includes(v.type);
}
});
return typeFlag;
}
return true;
});
const fileYup = Yup.mixed()
.test('fileSize', fileSizeTooLarge, (value) => (value ? value.size <= FILE_SIZE : true))
.test('fileType', fileTypeNotSupported, (value) => (value ? SUPPORTED_FORMATS.includes(value.type) : true));
const checkboxYup = Yup.boolean().test('checkbox', checkboxMessage, (value) => value as boolean);
const passwordYup = Yup.string()
.required(requiredMessage)
.test('password', passwordMessage, (val) =>
/(?=(?:.*[A-Z].*){1})(?=(?:.*[a-z].*){1})(?=(?:.*[0-9].*){1})/.test(val as string),
)
.min(8, passwordMessage)
.max(14, passwordMessage);
export const loginSchema = Yup.object().shape({
email: emailYup,
password: passwordYup,
});
export const registerSchema = Yup.object().shape({
firstName: nameYup,
lastName: nameYup,
email: emailYup,
password: passwordYup,
phoneNumber: phoneRequiredYup,
birthDate: requiredYup,
role: requiredYup,
});
export const simpleFormSchema = Yup.object().shape({
name: nameYup,
email: emailYup,
phone: phoneRequiredYup,
file: fileYup,
files: filesYup,
text: textYup,
checkbox: checkboxYup,
});
export const roleSchema = Yup.object().shape({
name: nameYup,
});