/** * Return date formated highest to lowest: YYYY-MM-DD H:mm AM * * @param {Date | number | string} date Date or timestamp to convert to string * @return {string} Formated date */ export function formatDate(date: Date | number | string): string { if(typeof date == 'number' || typeof date == 'string') date = new Date(date); let hours = date.getHours(), postfix = 'AM'; if(hours >= 12) { if(hours > 12) hours -= 12; postfix = 'PM'; } else if(hours == 0) hours = 12; return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}, ${hours}:${date.getMinutes().toString().padStart(2, '0')} ${postfix}`; } /** * Use in conjunction with `await` to pause an async script * * @example * ```js * await sleep(1000) // Pause for 1 second * ``` * * @param {number} ms - Time to pause for in milliseconds * @returns {Promise} - Resolves promise when it's time to resume */ export function sleep(ms: number): Promise { return new Promise(res => setTimeout(res, ms)); } /** * Sleep while function returns true * * @example * ```js * let loading = true; * setTimeout(() => wait = false, 1000); * await sleepWhile(() => loading); // Won't continue until loading flag is false * ``` * * @param {() => boolean | Promise} fn Return true to continue * @param {number} checkInterval Run function ever x milliseconds * @return {Promise} Callback when sleep is over */ export async function sleepWhile(fn : () => boolean | Promise, checkInterval = 100): Promise { while(await fn()) await sleep(checkInterval); } /** * Calculate the number of milliseconds until date/time * * @param {Date | number} date - Target * @returns {number} - Number of milliseconds until target */ export function timeUntil(date: Date | number): number { return (date instanceof Date ? date.getTime() : date) - (new Date()).getTime(); }