const moment = require('moment');
const zxcvbn = require('zxcvbn');
const months = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
];
module.exports = {
validate: {
keys: function(obj, keys) {
for (const key_data of keys) {
let [key, error, validator] = Array.isArray(key_data) ? key_data : [key_data];
validator = validator || (x => x);
error = error || `Invalid ${key}`;
if (!Object.prototype.hasOwnProperty.call(obj, key) || !validator(obj[key])) {
logger.log("key", key, "missing or invalid in obj", obj);
return new Promise((_, r) => r(error));
}
}
return new Promise(r => r(obj));
},
password: function(str) {
return zxcvbn(str);
},
iso_date: function(dateString) {
const regEx = /^\d{4}-\d{2}-\d{2}$/;
if (!dateString.match(regEx)) return false; // Invalid format
const d = new Date(dateString);
const dNum = d.getTime();
if (!dNum && dNum !== 0) return false; // NaN value, Invalid date
return d.toISOString().slice(0, 10) === dateString;
},
date: function(date) {
return !isNaN(date) && 0 <= date && date <= 31;
},
month: function(month) {
return !isNaN(month) && 0 <= month <= 12;
}
},
resolve: data => new Promise(r => r(data)),
reject: error => new Promise((_, r) => r(error)),
round: function(num) {
return Math.round((num + Number.EPSILON) * 100) / 100;
},
months: months,
get_recurring_text: function(month_num) {
return month_num > 0 ? "yearly on " + months[month_num] : "monthly on the";
},
format_time: function(time) {
return moment(time).format("dddd MMM Do");
},
format_date: function(date) {
const th = date > 3 && date < 21 ? 'th' : {
1: 'st',
2: 'nd',
3: 'rd'
} [date % 10] || 'th';
return `${date}${th}`;
},
capitalize: function(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
},
setIntervalAndTriggerImmediate: function(callback, interval) {
setTimeout(callback);
return setInterval(callback, interval);
}
};