export function formatDate(date, options = {}) {
const d = new Date(date);
if (isNaN(d.getTime())) {
return 'Invalid date';
}
const defaults = {
year: 'numeric',
month: 'short',
day: 'numeric',
};
return new Intl.DateTimeFormat('en-US', { ...defaults, ...options }).format(d);
}
export function formatTime(date, options = {}) {
const d = new Date(date);
if (isNaN(d.getTime())) {
return 'Invalid time';
}
const defaults = {
hour: 'numeric',
minute: '2-digit',
};
return new Intl.DateTimeFormat('en-US', { ...defaults, ...options }).format(d);
}
export function formatRelative(date) {
const now = new Date();
const d = new Date(date);
const diffMs = now - d;
const diffSec = Math.floor(diffMs / 1000);
const diffMin = Math.floor(diffSec / 60);
const diffHour = Math.floor(diffMin / 60);
const diffDay = Math.floor(diffHour / 24);
if (diffSec < 60) return 'just now';
if (diffMin < 60) return `${diffMin}m ago`;
if (diffHour < 24) return `${diffHour}h ago`;
if (diffDay < 7) return `${diffDay}d ago`;
return formatDate(d);
}
export function formatNumber(num, options = {}) {
return new Intl.NumberFormat('en-US', options).format(num);
}
export function formatCurrency(amount, currency = 'USD') {
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency,
}).format(amount);
}
export function formatBytes(bytes, decimals = 2) {
if (bytes === 0) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${sizes[i]}`;
}
export function formatPercent(value, decimals = 0) {
return new Intl.NumberFormat('en-US', {
style: 'percent',
minimumFractionDigits: decimals,
maximumFractionDigits: decimals,
}).format(value);
}
export function pluralize(count, singular, plural) {
return count === 1 ? singular : (plural || `${singular}s`);
}
export function truncate(str, maxLength, suffix = '...') {
if (!str || str.length <= maxLength) {
return str;
}
return str.slice(0, maxLength - suffix.length) + suffix;
}
export function capitalize(str) {
if (!str) return '';
return str.charAt(0).toUpperCase() + str.slice(1);
}
export function slugify(str) {
return str
.toLowerCase()
.trim()
.replace(/[^\w\s-]/g, '')
.replace(/[\s_-]+/g, '-')
.replace(/^-+|-+$/g, '');
}