mirror of
https://github.com/ruvnet/RuVector.git
synced 2026-05-25 15:03:46 +00:00
Major additions: - Complete Next.js studio application with 1600+ components - Docker support (Dockerfile.combined, docker-compose.yml) - GCP deployment documentation and benchmarks - SQL benchmark scripts for performance testing - Sentry integration for monitoring - Comprehensive test suite and mocks Studio features: - Dashboard and admin interfaces - Data visualization components - Authentication and user management - API integration with RuVector backend - Static data and public assets 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
37 lines
1,014 B
TypeScript
37 lines
1,014 B
TypeScript
import dayjs from 'dayjs'
|
|
import duration from 'dayjs/plugin/duration'
|
|
|
|
dayjs.extend(duration)
|
|
|
|
export const formatDuration = (milliseconds: number) => {
|
|
const duration = dayjs.duration(milliseconds, 'milliseconds')
|
|
|
|
const days = Math.floor(duration.asDays())
|
|
const hours = duration.hours()
|
|
const minutes = duration.minutes()
|
|
const seconds = duration.seconds()
|
|
const totalSeconds = duration.asSeconds()
|
|
|
|
if (totalSeconds < 60) {
|
|
return `${totalSeconds.toFixed(2)}s`
|
|
}
|
|
|
|
const parts = []
|
|
if (days > 0) parts.push(`${days}d`)
|
|
if (hours > 0) parts.push(`${hours}h`)
|
|
if (minutes > 0) parts.push(`${minutes}m`)
|
|
if (seconds > 0) parts.push(`${seconds}s`)
|
|
|
|
return parts.length > 0 ? parts.join(' ') : '0s'
|
|
}
|
|
|
|
export const transformLogsToJSON = (log: string) => {
|
|
try {
|
|
let jsonString = log.replace('[pg_stat_monitor] ', '')
|
|
jsonString = jsonString.replace(/""/g, '","')
|
|
const jsonObject = JSON.parse(jsonString)
|
|
return jsonObject
|
|
} catch (error) {
|
|
return null
|
|
}
|
|
}
|