43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import { clsx, type ClassValue } from "clsx";
|
|
import { twMerge } from "tailwind-merge";
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs))
|
|
}
|
|
|
|
export function getFirstLetters(str: string, n: number): string {
|
|
return str
|
|
.split(/\s+/)
|
|
.slice(0, n)
|
|
.map(word => word[0] || '')
|
|
.join('');
|
|
}
|
|
|
|
export function formatFileSize(bytes: number, decimals = 2): string {
|
|
if (bytes === 0) return '0 Bytes';
|
|
const k = 1024;
|
|
const dm = decimals < 0 ? 0 : decimals;
|
|
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
|
}
|
|
|
|
export function createPrefixedLogger(prefix: string, styles?: string[]) {
|
|
const result: Record<string, (...args: any[]) => void> = {};
|
|
|
|
const methods = ['log', 'trace', 'debug', 'info', 'warn', 'error'] as const;
|
|
|
|
for (const methodName of methods) {
|
|
const originalMethod = console[methodName].bind(console);
|
|
|
|
result[methodName] = (...args: any[]) => {
|
|
if (typeof args[0] === 'string') {
|
|
originalMethod(`${prefix} ${args[0]}`, ...(styles || []), ...args.slice(1));
|
|
} else {
|
|
originalMethod(prefix, styles, ...args);
|
|
}
|
|
};
|
|
}
|
|
|
|
return result;
|
|
} |