Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 16 additions & 14 deletions lib/calculate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,12 +135,12 @@ export function calculateStreak(
};
}

const weeks = calendar.weeks || [];
const days = weeks.flatMap((week) => week?.contributionDays || []).filter(Boolean);
const weeks = (calendar.weeks || []).filter(Boolean);
const days = weeks.flatMap((week) => (week?.contributionDays || []).filter(Boolean)).filter(Boolean);

const seen = new Set<string>();
const uniqueDays = days.filter((d) => {
if (!d || seen.has(d.date)) return false;
if (!d || !d.date || seen.has(d.date)) return false;
seen.add(d.date);
return true;
});
Expand Down Expand Up @@ -271,8 +271,8 @@ export function calculateMonthlyStats(
};
}

const weeks = calendar.weeks || [];
const days = weeks.flatMap((week) => week?.contributionDays || []).filter(Boolean);
const weeks = (calendar.weeks || []).filter(Boolean);
const days = weeks.flatMap((week) => (week?.contributionDays || []).filter(Boolean)).filter(Boolean);

const localTodayStr = getLocalTodayStr(now || new Date(), timezone || 'UTC');
const [currentYearStr, currentMonthStr] = localTodayStr.split('-');
Expand Down Expand Up @@ -379,8 +379,8 @@ export function aggregateCalendars(
}

// Populate the Map with all contributions from all calendars
(cal.weeks || []).forEach((week) => {
(week?.contributionDays || []).forEach((day) => {
(cal.weeks || []).filter(Boolean).forEach((week) => {
(week?.contributionDays || []).filter(Boolean).forEach((day) => {
if (day && day.date) {
const currentCount = dateMap.get(day.date) || 0;
dateMap.set(day.date, currentCount + (day.contributionCount || 0));
Expand All @@ -398,8 +398,8 @@ export function aggregateCalendars(
aggregatedBase.totalContributions = totalContributions;

// Re-map the structural base using our aggregated date map
(aggregatedBase.weeks || []).forEach((week) => {
(week?.contributionDays || []).forEach((day) => {
(aggregatedBase.weeks || []).filter(Boolean).forEach((week) => {
(week?.contributionDays || []).filter(Boolean).forEach((day) => {
if (day && day.date) {
day.contributionCount = dateMap.get(day.date) || 0;
}
Expand All @@ -408,8 +408,8 @@ export function aggregateCalendars(

const existingDates = new Set<string>();

(aggregatedBase.weeks || []).forEach((week) => {
(week?.contributionDays || []).forEach((day) => {
(aggregatedBase.weeks || []).filter(Boolean).forEach((week) => {
(week?.contributionDays || []).filter(Boolean).forEach((day) => {
if (day && day.date) {
existingDates.add(day.date);
}
Expand Down Expand Up @@ -490,8 +490,8 @@ export function calculateWrappedStats(calendar?: ContributionCalendar | null) {
};
}

const weeks = calendar.weeks || [];
const days = weeks.flatMap((w) => w?.contributionDays || []).filter(Boolean);
const weeks = (calendar.weeks || []).filter(Boolean);
const days = weeks.flatMap((w) => (w?.contributionDays || []).filter(Boolean)).filter(Boolean);

let mostActiveDay = { date: 'N/A', count: 0 };
const monthCounts: Record<string, number> = {};
Expand Down Expand Up @@ -564,7 +564,9 @@ export function normalizeCalendarToTimezone(
}

// Flatten all contribution days
const allDays = calendar.weeks.flatMap((week) => week.contributionDays || []);
const allDays = (calendar.weeks || [])
.filter(Boolean)
.flatMap((week) => (week.contributionDays || []).filter(Boolean));

// Group contributions by target timezone date
const dateMap = new Map<string, number>();
Expand Down
56 changes: 30 additions & 26 deletions lib/github.ts
Original file line number Diff line number Diff line change
Expand Up @@ -917,33 +917,37 @@ async function fetchContributionsUncached(
calendar.lastSyncedAt = new Date().toISOString();

// 1. Fabricate the LOC additions and deletions fields with strict lint-compliant object mappings
const processedWeeks = (calendar.weeks || []).map((week: unknown) => {
const rawWeek = week as unknown as Record<string, unknown>;
const contributionDays = Array.isArray(rawWeek.contributionDays)
? rawWeek.contributionDays
: [];
const processedWeeks = (calendar.weeks || [])
.filter(Boolean)
.map((week: unknown) => {
const rawWeek = week as unknown as Record<string, unknown>;
const contributionDays = Array.isArray(rawWeek.contributionDays)
? rawWeek.contributionDays
: [];

return {
...rawWeek,
contributionDays: contributionDays.map((day: unknown) => {
const rawDay = day as unknown as Record<string, unknown>;
const count = typeof rawDay.contributionCount === 'number' ? rawDay.contributionCount : 0;

if (count === 0) {
return {
...rawDay,
locAdditions: 0,
locDeletions: 0,
};
}
return {
...rawDay,
locAdditions: undefined,
locDeletions: undefined,
};
}),
};
}) as unknown as typeof calendar.weeks;
return {
...rawWeek,
contributionDays: contributionDays
.filter(Boolean)
.map((day: unknown) => {
const rawDay = day as unknown as Record<string, unknown>;
const count = typeof rawDay.contributionCount === 'number' ? rawDay.contributionCount : 0;

if (count === 0) {
return {
...rawDay,
locAdditions: 0,
locDeletions: 0,
};
}
return {
...rawDay,
locAdditions: undefined,
locDeletions: undefined,
};
}),
};
}) as unknown as typeof calendar.weeks;

// 2. Return the extended structure with processed fields packed into the calendar
return {
Expand Down
Loading