UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 10.5 kB
{"version":3,"file":"index.cjs","sources":["../../../src/utils/index.ts"],"sourcesContent":["// Utility Functions Export\n// Re-export all utility functions for easy consumption\n\nexport * from './api';\nexport * from './auth';\nexport * from './validation';\nexport * from './storage';\nexport * from './crypto';\nexport * from './url';\nexport * from './format';\nexport * from './error';\nexport * from './theme';\n\n// Common utility functions\nexport const sleep = (ms: number): Promise<void> =>\n new Promise(resolve => setTimeout(resolve, ms));\n\nexport const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n immediate?: boolean\n): ((...args: Parameters<T>) => void) => {\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n const later = () => {\n timeout = null;\n if (!immediate) func(...args);\n };\n\n const callNow = immediate && !timeout;\n\n if (timeout) clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n\n if (callNow) func(...args);\n };\n};\n\nexport const throttle = <T extends (...args: any[]) => any>(\n func: T,\n limit: number\n): ((...args: Parameters<T>) => void) => {\n let inThrottle: boolean;\n\n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n};\n\nexport const omit = <T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n};\n\nexport const pick = <T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> => {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n};\n\nexport const isEmpty = (value: any): boolean => {\n if (value == null) return true;\n if (typeof value === 'string') return value.length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value).length === 0;\n return false;\n};\n\nexport const isEqual = (a: any, b: any): boolean => {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== typeof b) return false;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n return a.every((val, index) => isEqual(val, b[index]));\n }\n\n if (typeof a === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n return keysA.every(key => isEqual(a[key], b[key]));\n }\n\n return false;\n};\n\nexport const generateId = (): string => {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n};\n\nexport const clamp = (value: number, min: number, max: number): number => {\n return Math.min(Math.max(value, min), max);\n};\n\nexport const arrayToObject = <T>(\n array: T[],\n keyFn: (item: T) => string\n): Record<string, T> => {\n return array.reduce((acc, item) => {\n acc[keyFn(item)] = item;\n return acc;\n }, {} as Record<string, T>);\n};\n\nexport const groupBy = <T>(\n array: T[],\n keyFn: (item: T) => string\n): Record<string, T[]> => {\n return array.reduce((acc, item) => {\n const key = keyFn(item);\n if (!acc[key]) acc[key] = [];\n acc[key].push(item);\n return acc;\n }, {} as Record<string, T[]>);\n};\n\nexport const unique = <T>(array: T[]): T[] => {\n return [...new Set(array)];\n};\n\nexport const uniqueBy = <T>(array: T[], keyFn: (item: T) => any): T[] => {\n const seen = new Set();\n return array.filter(item => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\nexport const capitalize = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n};\n\nexport const camelCase = (str: string): string => {\n return str\n .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (word, index) => {\n return index === 0 ? word.toLowerCase() : word.toUpperCase();\n })\n .replace(/\\s+/g, '');\n};\n\nexport const kebabCase = (str: string): string => {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n};\n\nexport const snakeCase = (str: string): string => {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase();\n};\n\nexport const truncate = (str: string, length: number, suffix = '...'): string => {\n if (str.length <= length) return str;\n return str.substring(0, length - suffix.length) + suffix;\n};\n\nexport const randomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\n\nexport const randomChoice = <T>(array: T[]): T => {\n return array[randomInt(0, array.length - 1)];\n};\n\nexport const retry = async <T>(\n fn: () => Promise<T>,\n maxAttempts = 3,\n delay = 1000\n): Promise<T> => {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (attempt === maxAttempts) break;\n await sleep(delay * attempt);\n }\n }\n\n throw lastError!;\n};\n\nexport const withTimeout = <T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage = 'Operation timed out'\n): Promise<T> => {\n return Promise.race([\n promise,\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(errorMessage)), timeoutMs)\n ),\n ]);\n};\n\nexport const memoize = <T extends (...args: any[]) => any>(\n fn: T,\n keyFn?: (...args: Parameters<T>) => string\n): T => {\n const cache = new Map();\n\n return ((...args: Parameters<T>) => {\n const key = keyFn ? keyFn(...args) : JSON.stringify(args);\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n\n const result = fn(...args);\n cache.set(key, result);\n return result;\n }) as T;\n};"],"names":["sleep","ms","resolve","debounce","func","wait","immediate","timeout","args","later","callNow","throttle","limit","inThrottle","omit","obj","keys","result","key","pick","isEmpty","value","isEqual","a","b","val","index","keysA","keysB","generateId","clamp","min","max","arrayToObject","array","keyFn","acc","item","groupBy","unique","uniqueBy","seen","capitalize","str","camelCase","word","kebabCase","snakeCase","truncate","length","suffix","randomInt","randomChoice","retry","fn","maxAttempts","delay","lastError","attempt","error","withTimeout","promise","timeoutMs","errorMessage","_","reject","memoize","cache"],"mappings":"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"}