| |
| |
| |
| |
|
|
| |
| |
| |
| export function toNumber(value: unknown): number | null { |
| const n = typeof value === 'number' ? value : Number(value) |
| return Number.isFinite(n) ? n : null |
| } |
|
|
| |
| |
| |
| |
| export function pick<T extends Record<string, unknown>>( |
| obj: T | null | undefined, |
| keys: string[] |
| ): unknown { |
| if (!obj) return undefined |
| for (const k of keys) { |
| if (k in obj) return obj[k] |
| } |
| return undefined |
| } |
|
|
| |
| |
| |
| |
| export async function getSymbolFromParams( |
| params: Promise<{ symbol: string }> | { symbol: string } |
| ): Promise<string | null> { |
| const resolved = await params |
| const raw = resolved?.symbol |
| if (!raw || typeof raw !== 'string') return null |
| const symbol = raw.toUpperCase().trim() |
| |
| if (!/^[A-Z0-9.]{1,20}$/.test(symbol)) return null |
| return symbol |
| } |
|
|
| |
| |
| |
| |
| export function sanitizeErrorMessage(error: unknown): string { |
| if (!error) return 'Bilinmeyen hata' |
| const message = error instanceof Error ? error.message : String(error) |
| |
| |
| let sanitized = message.replace(/\/[\w./\\-]+\.(ts|js|tsx|jsx|py|json)/gi, '[path]') |
| |
| sanitized = sanitized.replace(/at\s+\w+.*\(.*\)/g, '') |
| |
| sanitized = sanitized.replace(/https?:\/\/[^\s"')]+/g, '[url]') |
| |
| if (sanitized.length > 200) { |
| sanitized = sanitized.slice(0, 200) + '...' |
| } |
| return sanitized.trim() || 'Bilinmeyen hata' |
| } |
|
|