@azteam/util
Version:
N/A
227 lines (193 loc) • 6.64 kB
JavaScript
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);
}