diff --git a/src/app/api/local-coding/sync/route.ts b/src/app/api/local-coding/sync/route.ts index 6b444d7f4..38aa87b39 100644 --- a/src/app/api/local-coding/sync/route.ts +++ b/src/app/api/local-coding/sync/route.ts @@ -205,7 +205,7 @@ export async function POST(req: NextRequest) { ); } - const incomingDates = [...new Set(newSessions.map((session) => session.date))]; + const incomingDates = [...new Set((newSessions ?? []).map((session) => session.date))]; const { data: existingSessionsForDates } = await supabaseAdmin .from("local_coding_sessions") .select("date") @@ -278,7 +278,7 @@ export async function GET(req: NextRequest) { } const { searchParams } = new URL(req.url); - const rawDays = parseInt(searchParams.get("days") || "30", 10); + const rawDays = parseInt(searchParams.get("days", 10) || "30", 10); const days = validateDays(isNaN(rawDays) ? DEFAULT_DAYS : rawDays); const fromDate = new Date(); fromDate.setDate(fromDate.getDate() - days); diff --git a/src/app/api/metrics/languages/route.ts b/src/app/api/metrics/languages/route.ts index ed24444af..675493f48 100644 --- a/src/app/api/metrics/languages/route.ts +++ b/src/app/api/metrics/languages/route.ts @@ -56,7 +56,7 @@ export async function GET(req: NextRequest) { const data = await withMetricsCache({ bypass, key, ttlSeconds: METRICS_CACHE_TTL_SECONDS.languages }, async () => { const headers = { Authorization: `Bearer ${token}`, Accept: "application/vnd.github+json" }; const since = new Date(); - const rawDays = parseInt(req.nextUrl.searchParams.get("days") ?? "90", 10); const days = Number.isFinite(rawDays) && rawDays > 0 ? Math.min(rawDays, 365) : 90; + const rawDays = parseInt(req.nextUrl.searchParams.get("days", 10) ?? "90", 10); const days = Number.isFinite(rawDays) && rawDays > 0 ? Math.min(rawDays, 365) : 90; const searchRes = await fetch( `${GITHUB_API}/search/commits?q=author:${githubLogin}+author-date:>=${since.toISOString().slice(0, 10)}&per_page=100&sort=author-date&order=desc`, @@ -65,7 +65,7 @@ export async function GET(req: NextRequest) { if (!searchRes.ok) throw new Error("API Error"); const raw = await searchRes.json(); - const repoNames = Array.from(new Set(raw.items.map((i: any) => i.repository.full_name))); + const repoNames = Array.from(new Set(raw.(items ?? []).map((i: any) => i.repository.full_name))); const topRepoNames = repoNames.slice(0, 20); const langTotals: Record = {}; const failedRepos: Array<{ name: string; statusCode?: number; error: string }> = []; diff --git a/src/app/api/metrics/repo-health/route.ts b/src/app/api/metrics/repo-health/route.ts index 8e059da02..058acefe7 100644 --- a/src/app/api/metrics/repo-health/route.ts +++ b/src/app/api/metrics/repo-health/route.ts @@ -150,7 +150,7 @@ export async function GET(req: NextRequest) { return Response.json({ error: "Unauthorized" }, { status: 401 }); } - const requestedDays = parseInt(req.nextUrl.searchParams.get("days") ?? "30", 10); + const requestedDays = parseInt(req.nextUrl.searchParams.get("days", 10) ?? "30", 10); // Only allow 7, 30, or 90 day windows — other values default to 30. const days = requestedDays === 7 || requestedDays === 30 || requestedDays === 90 ? requestedDays : 30; diff --git a/src/components/ContributionHeatmap.tsx b/src/components/ContributionHeatmap.tsx index 740750c0a..59028ff79 100644 --- a/src/components/ContributionHeatmap.tsx +++ b/src/components/ContributionHeatmap.tsx @@ -318,7 +318,7 @@ export default function ContributionHeatmap({ commits.forEach((c) => { if (c.repo) reposSet.add(c.repo); }); - return Array.from(reposSet).sort(); + return Array.from(reposSet).sort((a, b) => a - b); }, [commits]); // Extract unique languages @@ -329,7 +329,7 @@ export default function ContributionHeatmap({ if (l.name) langsSet.add(l.name); }); }); - return Array.from(langsSet).sort(); + return Array.from(langsSet).sort((a, b) => a - b); }, [reposData]); // Map each repo to its languages for quick lookup @@ -379,7 +379,7 @@ export default function ContributionHeatmap({ ); const weekCount = Math.ceil(cells.length / 7); const maxCommits = Math.max( - ...cells.map((cell) => cell.count), + ...(cells ?? []).map((cell) => cell.count), 1 ); // 100% MATHEMATICALLY PRECISE MONTH TRACKING SYSTEM diff --git a/src/hooks/useRealtimeSync.ts b/src/hooks/useRealtimeSync.ts index 0f43efa36..fe9689c64 100644 --- a/src/hooks/useRealtimeSync.ts +++ b/src/hooks/useRealtimeSync.ts @@ -97,7 +97,7 @@ export function useRealtimeSync( // Stabilise `events` so an inline array definition (e.g. `["INSERT", "DELETE"]`) // doesn't cause the effect to re-run on every render. - const eventsKey = [...events].sort().join(","); + const eventsKey = [...events].sort((a, b) => a - b).join(","); useEffect(() => { const supabase = getSupabaseClient();