/**
* Assess if the string is of a certain value (useful to compare passwords)
* @param {String} val - the value to evaluate the string against
* @returns {function(*): (boolean|string)}
*/
export function hasValue(val){
return value => value === val || "Invalid repeated password"
}
/**
* Assess email patterns.
* @returns {function(*): (boolean|string)}
*/
export function isEmail(){
return value => {
const pattern = /^(([^<>()[\]\\.,;:\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,}))$/
return pattern.test(value) || 'Invalid e-mail.'
}
}
/**
* Assess mastodon username @user@server.
* @returns {function(*): (boolean|string)}
*/
export function isMastodon(){
return value => {
if (!value) return true;
const pattern = /^@[A-Za-z]+@[A-Za-z\\.]+$/
return pattern.test(value) || 'Invalid mastodon handle: Use @user@server.'
}
}
/**
* Assess bluesjy username @user@server.
* @returns {function(*): (boolean|string)}
*/
export function isBluesky(){
return value => {
if (!value) return true;
const pattern = /^@[A-Za-z]+[A-Za-z\\.]+$/
return pattern.test(value) || 'Invalid Bluesky handle: Use @username.domain.name'
}
}
/**
* Assess the presence of the field
* @returns {function(*=): (boolean|string)}
*/
export function isRequired(){
return value => !(!value || value.length === 0 || JSON.stringify(value) === '{}') || 'Required'
}
/**
* Assess URL patterns.
* @returns {function(*): (boolean|string)}
*/
export function isUrl() {
return value => {
if (!value) return true;
const pattern = /[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,8}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)?/gi;
return pattern.test(value) || 'Invalid URL.'
}
}
/**
* Assess email or email patterns.
* @returns {function(*): (boolean|string)}
*/
export function isEmailOrUrl(){
return value => {
const pattern = /^(([^<>()[\]\\.,;:\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,}))$/
const patternUrl = /[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,8}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)?/gi;
return pattern.test(value) || patternUrl.test(value) || 'Invalid e-mail/URL.'
}
}
/**
* Assess if the string is long enough.
* @param {Number} length - the length to evaluate the string against.
* @returns {function(*): (boolean|string)}
*/
export function isLongEnough(length) {
return value => {
let error = (value) ? `Value is not long enough (${value.length}/${length})` : `Value is not long enough (0/${length})`;
if (!value) return error;
return value.length >= length || error;
}
}
/**
* Assess ORCID patterns. Can be empty if required is false.
* @params {Boolean} required - is the field required or not.
* @returns {function(*): (boolean|string)}
*/
export function isOrcid(required) {
return value => {
if (!value && !required) return true; // because this is an optional Orcid ID
const pattern = /^(\d|X){4}-(\d|X){4}-(\d|X){4}-(\d|X){4}$/gi;
return pattern.test(value) || "Doesn't look like a valid ORCID ID."
}
}
/**
* Assess if the given file has the correct extension
* @returns {function(*): (boolean|string)}
*/
export function isImage(){
const accept = ["image/png", "image/jpeg"];
return value => {
return (!value || accept.indexOf(value.type) > -1) || "File type should be PNG or JPEG"
}
}
/**
* Assess if the given file has the correct allowed size
* @returns {function(*): (boolean|string)}
*/
export function isAllowedSize(allowedSize) {
// allowedSize is based on MB
return value => {
if (!value) return false
// if its an array of image
if (value.length > 1) {
let finalVal = value.map(imageItem => {
if (imageItem.size > (1000000 * allowedSize)) {
return false
}
})
return !finalVal.includes(false) || `One or some of your selected files' size is more than ${allowedSize} MB!`
}
else {
// if its a single image
return (!value[0] || value[0].size < (1000000 * allowedSize)) || `file size should be less than ${allowedSize} MB!`
}
}
}