127.0.0.1:8000 budget / master src / js / utils / index.js
master

Tree @master (Download .tar.gz)

index.js @masterraw · history · blame

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);
    }
};