// @ts-check import toEmoji from "emoji-name-map"; /** * Returns boolean if value is either "true" or "false" else the value as it is. * * @param {string | boolean} value The value to parse. * @returns {boolean | undefined } The parsed value. */ const parseBoolean = (value) => { if (typeof value === "boolean") { return value; } if (typeof value === "string") { if (value.toLowerCase() === "true") { return true; } else if (value.toLowerCase() === "false") { return false; } } return undefined; }; /** * Parse string to array of strings. * * @param {string} str The string to parse. * @returns {string[]} The array of strings. */ const parseArray = (str) => { if (!str) { return []; } return str.split(","); }; /** * Clamp the given number between the given range. * * @param {number} number The number to clamp. * @param {number} min The minimum value. * @param {number} max The maximum value. * @returns {number} The clamped number. */ const clampValue = (number, min, max) => { // @ts-ignore if (Number.isNaN(parseInt(number, 10))) { return min; } return Math.max(min, Math.min(number, max)); }; /** * Lowercase and trim string. * * @param {string} name String to lowercase and trim. * @returns {string} Lowercased and trimmed string. */ const lowercaseTrim = (name) => name.toLowerCase().trim(); /** * Split array of languages in two columns. * * @template T Language object. * @param {Array} arr Array of languages. * @param {number} perChunk Number of languages per column. * @returns {Array} Array of languages split in two columns. */ const chunkArray = (arr, perChunk) => { return arr.reduce((resultArray, item, index) => { const chunkIndex = Math.floor(index / perChunk); if (!resultArray[chunkIndex]) { // @ts-ignore resultArray[chunkIndex] = []; // start a new chunk } // @ts-ignore resultArray[chunkIndex].push(item); return resultArray; }, []); }; /** * Parse emoji from string. * * @param {string} str String to parse emoji from. * @returns {string} String with emoji parsed. */ const parseEmojis = (str) => { if (!str) { throw new Error("[parseEmoji]: str argument not provided"); } return str.replace(/:\w+:/gm, (emoji) => { return toEmoji.get(emoji) || ""; }); }; /** * Get diff in minutes between two dates. * * @param {Date} d1 First date. * @param {Date} d2 Second date. * @returns {number} Number of minutes between the two dates. */ const dateDiff = (d1, d2) => { const date1 = new Date(d1); const date2 = new Date(d2); const diff = date1.getTime() - date2.getTime(); return Math.round(diff / (1000 * 60)); }; export { parseBoolean, parseArray, clampValue, lowercaseTrim, chunkArray, parseEmojis, dateDiff, };