Source: pure-fns.js

/**
 * @file pure-fns.js
 * Barrel module for the pure-function helpers, which live in themed leaf
 * sub-modules: pure-fns-format.js (CSS/HTML safety, date/time/duration
 * formatting, billing rounding), pure-fns-validate.js (schema, backup, and
 * external-API validators), pure-fns-tasks.js (rapid-capture grammar,
 * carry-forward status, work location), pure-fns-export.js (billable export
 * grouping), pure-fns-gapreport.js (gap report and export warnings),
 * pure-fns-weeklyreport.js (weekly report draft), pure-fns-rollingsummary.js
 * (rolling summary), pure-fns-backup.js (backup retention), and
 * pure-fns-epics.js (epic staleness and archiving) — the last five split out
 * of one former pure-fns-export.js (QA 2026-09-07, largest-module finding).
 * Re-exports every public symbol so existing imports of './pure-fns.js'
 * keep working unchanged.
 */

export {
  safeCssColor,
  escHtml,
  jiraKeyLinkHtml,
  dk,
  fmtTime,
  fmtElapsed,
  fmtDur,
  fmtAgo,
  fmtDurLong,
  isLongRunningTimer,
  mondayOfWeek,
  roundToNearest30,
  calcStreak,
} from './pure-fns-format.js';

export {
  validEntry,
  validCategory,
  validPlanTask,
  validBlock,
  validTimer,
  validPomoEntry,
  validateBackupFile,
  filterNewBackupEntries,
  validWeatherResponse,
  validCalendarMeeting,
  normalizeCalendarMeeting,
  calendarMeetingKey,
  isMeetingHidden,
  validJiraCsvRow,
} from './pure-fns-validate.js';

export {
  parseRapidTokens,
  resolveCarryStatus,
  findWeeklyPlanReviewTasks,
  findPromotableTask,
  WORK_LOCATIONS,
  locationFor,
  nextLocation,
} from './pure-fns-tasks.js';

export {
  buildTimesheetDescription,
  buildTimesheetDayPayload,
  findTimesheetEntryProblem,
  resolveEodTimestamp,
  selectUnfinishedWorkedTasks,
  selectDevChangesForDay,
} from './pure-fns-hours-entry.js';

export {
  parseJiraLabel,
  groupEntriesByCategory,
  buildTimesheetSummaryLine,
  computeDayBounds,
  isWorkdayLikelyOver,
  buildTaskNoteMap,
  buildEntryNoteMap,
  buildEntryLinkMap,
  mergeNoteMaps,
} from './pure-fns-export.js';

export {
  GAP_REPORT_UTILITY_TEXTS,
  findGapReportEntries,
  findExportWarnings,
  formatGroupedLines,
} from './pure-fns-gapreport.js';

export {
  WEEKLY_REPORT_NO_TICKET_KEY,
  buildWeeklyTicketSummary,
  formatWeeklyTicketSummaryText,
} from './pure-fns-weeklyreport.js';

export { buildRollingSummary } from './pure-fns-rollingsummary.js';

export { applyBackupRetention, buildBackupPayload } from './pure-fns-backup.js';

export {
  EPIC_STALE_DAYS,
  PROTECTED_CAT_IDS,
  epicCutoffDate,
  collectRecentlyUsedCatIds,
  findStaleCategories,
  pickableCategories,
  applyEpicArchive,
  restoreArchivedCategory,
} from './pure-fns-epics.js';