UNPKG

@azteam/util

Version:

N/A

227 lines (193 loc) 6.64 kB
import {execSync} from 'child_process'; import _ from 'lodash'; export function timeout(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } export function toSlug(text) { let slug = text.toLowerCase(); slug = slug.replace(/(à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ)/gu, 'a'); slug = slug.replace(/(è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ)/gu, 'e'); slug = slug.replace(/(ì|í|ị|ỉ|ĩ)/gu, 'i'); slug = slug.replace(/(ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ)/gu, 'o'); slug = slug.replace(/(ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ)/gu, 'u'); slug = slug.replace(/(ỳ|ý|ỵ|ỷ|ỹ)/gu, 'y'); slug = slug.replace(/(đ)/gu, 'd'); slug = slug.replace(/([.])/gu, '-'); slug = slug.replace(/([^0-9a-z-\s])/gu, ''); slug = slug.replace(/(\s+)/gu, '-'); slug = slug.replace(/-+/gu, '-'); slug = slug.replace(/^-+/gu, ''); slug = slug.replace(/-+$/gu, ''); return slug; } export function genCharArray(charStart = 'a', charEnd = 'z') { const array = 'ABCDEFGHiIJKLMNOPQRARUVWXYZ'.split(''); return array.slice(array.indexOf(charStart.toUpperCase()), array.indexOf(charEnd.toUpperCase()) + 1); } export function increasePercent(number, percent) { return number + number / (100 / percent); } export function decreasePercent(number, percent) { return number - number / (100 / percent); } export function omitItem(item, guard = [], allow = []) { if (allow === '*') { return item; } let guardFields = _.cloneDeep(guard); let itemFields = _.cloneDeep(item); if (_.isArray(guardFields)) { guardFields = _.difference(guardFields, allow); } if (itemFields.toJSON) { itemFields = item.toJSON(); } if (_.isObject(itemFields)) { if (guardFields === '*') { return _.pick(itemFields, allow); } return _.omit(itemFields, guardFields); } return itemFields; } export function omitArrayItem(arrayItem, guard, allow) { return _.map(arrayItem, (item) => { return omitItem(item, guard, allow); }); } export function differenceObject(obj1, obj2) { return _.omitBy( _.mapValues(obj1, (value1, key) => { const value2 = obj2[key]; const type1 = typeof value1; const type2 = typeof value2; if (typeof type2 !== 'undefined' && type1 === type2) { if (type1 === 'object') { if (Array.isArray(value1)) { return _.differenceWith(value1, value2, _.isEqual); } return differenceObject(value1, value2); } if (!_.isEqual(value1, value2)) { return value1; } return null; } return value1; }), (val) => { return (_.isEmpty(val) && !_.isNumber(val)) || _.isNaN(val); } ); } export async function promiseAllLimit(data, limit, asyncFunction) { let result = []; const cloneData = [...data]; while (cloneData.length) { const sliceValues = cloneData.splice(0, limit); const subResult = await Promise.all(sliceValues.map(asyncFunction)); result = [...result, ...subResult]; await timeout(10); // free blocking } return result; } export async function asyncLoop(data, asyncFunction, options = {}) { const {isLogProcessing, reverse} = options; const {length} = data; if (length) { if (reverse) { for (let i = length - 1; i >= 0; i -= 1) { if (isLogProcessing) { // eslint-disable-next-line no-console console.log('run reverse', `(${i + 1}/${length})`); } const result = await asyncFunction(data[i], i); if (typeof result !== 'undefined') { return result; } if (isLogProcessing) { // eslint-disable-next-line no-console console.log('done', `(${i + 1}/${length})`); } await timeout(1); // free blocking } } else { for (let i = 0; i < length; i += 1) { if (isLogProcessing) { // eslint-disable-next-line no-console console.log('run', `(${i + 1}/${length})`); } const result = await asyncFunction(data[i], i); if (typeof result !== 'undefined') { return result; } if (isLogProcessing) { // eslint-disable-next-line no-console console.log('done', `(${i + 1}/${length})`); } await timeout(1); // free blocking } } return true; } return false; } export async function retryExec(command, countRetry = 5, opts = {}) { let errorString = ''; do { try { const result = execSync(command, opts).toString(); return result.trim(); } catch (e) { errorString = e.toString(); // eslint-disable-next-line no-param-reassign countRetry -= 1; } } while (countRetry > 0); throw new Error(errorString); } export async function retryFunc(asyncFunc, limit = 5) { let retry = limit; let errorString = null; do { try { const result = await asyncFunc(); retry = 0; return { status: true, result, }; } catch (err) { retry -= 1; errorString = err.toString(); await timeout(1000); } } while (retry); return { status: false, error: errorString, }; } export function getMime(filePath) { return execSync(`file -b --mime-type "${filePath}"`).toString().trim(); } export function checkMime(filePath, fileType) { return getMime(filePath).includes(fileType); } export function setIntervalImmediately(func, interval) { func(); return setInterval(func, interval); } export function calculatePercentTwoNumber(number1, number2) { if (number1 === 0) { return 0; } if (number2 === 0) { return 100; } return Number(((number1 / (number1 + number2)) * 100).toFixed(2)); } export function getPercentDifference(a, b) { if (b === 0) return a * 100; return _.round((a / b) * 100 - 100, 2); }