// Pure function for week-rollover logic. // Exported separately for testability. /** * Apply week rollover to state file content. * Returns updated content string if rollover was applied, null otherwise. * * @param {string} stateContent - Full state file content (with YAML frontmatter) * @param {string} currentWeek - Week value from state file (e.g. "2026-W14") * @param {string} actualWeek - Computed current ISO week (e.g. "2026-W15") * @returns {{ content: string, message: string } | null} */ export function applyWeekRollover(stateContent, currentWeek, actualWeek) { if (!actualWeek) return null; // Case 1: current_week is empty — initialize without resetting posts if (!currentWeek) { const updated = stateContent.replace( /^current_week: .*/m, `current_week: "${actualWeek}"` ); if (updated === stateContent) return null; return { content: updated, message: `Initialized current_week to ${actualWeek}.` }; } // Case 2: week matches — no action needed if (currentWeek === actualWeek) return null; // Case 3: week changed — reset posts_this_week and update current_week let updated = stateContent; updated = updated.replace( /^posts_this_week: .*/m, 'posts_this_week: 0' ); updated = updated.replace( /^current_week: .*/m, `current_week: "${actualWeek}"` ); if (updated === stateContent) return null; return { content: updated, message: `Auto-reset: posts_this_week → 0 for new week ${actualWeek} (was ${currentWeek}).` }; }