utilaide
Version:
Modern utility helper library for cleaner, faster TypeScript/JavaScript development 🚀🔧
116 lines (115 loc) • 3.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.randomUUID = randomUUID;
exports.slugify = slugify;
exports.truncateText = truncateText;
exports.isEmail = isEmail;
exports.isURL = isURL;
exports.randomHexColor = randomHexColor;
exports.debounce = debounce;
exports.throttle = throttle;
exports.deepClone = deepClone;
exports.deepEqual = deepEqual;
exports.generateTokenBase64 = generateTokenBase64;
// 1. uuid: Generate a random UUID (v4 style)
function randomUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
const r = (Math.random() * 16) | 0;
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
// 2. slugify: "Hello World" → "hello-world"
function slugify(str) {
return str
.toLowerCase()
.trim()
.replace(/[^a-z0-9\s-]/g, '')
.replace(/\s+/g, '-');
}
// 3. truncateText: cut it off + add ellipsis
function truncateText(str, len) {
return str.length <= len ? str : str.slice(0, len).trimEnd() + '...';
}
// 4. isEmail: legit email or nah
function isEmail(str) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(str);
}
// 5. isURL: safe basic URL checker
function isURL(str) {
try {
new URL(str);
return true;
}
catch {
return false;
}
}
// 6. randomHexColor: 🎨 magic
function randomHexColor() {
return `#${Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0')}`;
}
// 7. debounce: stop spamming, chill
function debounce(fn, delay) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
}
// 8. throttle: cool down function calls
function throttle(fn, delay) {
let last = 0;
return (...args) => {
const now = Date.now();
if (now - last >= delay) {
last = now;
fn(...args);
}
};
}
// 9. deepClone: like cloning yourself in a sci-fi flick
function deepClone(obj) {
return structuredClone(obj); // modern, fast 🔥
// For older environments: return JSON.parse(JSON.stringify(obj))
}
// 10. deepEqual: check if two things are actually twins
function deepEqual(a, b) {
if (a === b)
return true;
if (typeof a !== typeof b || a === null || b === null)
return false;
if (typeof a === 'object') {
const aKeys = Object.keys(a);
const bKeys = Object.keys(b);
if (aKeys.length !== bKeys.length)
return false;
return aKeys.every(key => deepEqual(a[key], b[key]));
}
return false;
}
function generateTokenBase64(length = 32) {
const cryptoObj = typeof window !== 'undefined' && window.crypto
? window.crypto
: typeof globalThis !== 'undefined' && globalThis.crypto
? globalThis.crypto
: null;
if (!cryptoObj?.getRandomValues) {
throw new Error('Secure crypto not available in this environment.');
}
const bytes = new Uint8Array(length);
cryptoObj.getRandomValues(bytes);
// Convert bytes to base64 string
if (typeof window !== 'undefined' && typeof btoa === 'function') {
// Browser-safe
const binary = String.fromCharCode(...bytes);
return btoa(binary);
}
else if (typeof Buffer !== 'undefined') {
// Node.js
return Buffer.from(bytes).toString('base64');
}
else {
throw new Error('No base64 encoding method available.');
}
}