Functional Weave
Code in TypeScript

todo.due-label@1.0.0

impl/typescript.ts

1,211 bytes · the TypeScript implementation · view raw

Imports name this capability’s declared dependencies, which fune builds next to it in your project; each one links to its page.

import { parseIsoDate } from "./dates_add_days.ts";  ← from dates.add-days ^1.0.0 · built alongside by fune
import { dayName } from "./dates_day_of_week.ts";  ← from dates.day-of-week ^1.0.0 · built alongside by fune
import { daysBetween } from "./dates_days_between.ts";  ← from dates.days-between ^1.0.0 · built alongside by fune
import { dueStatus } from "./todo_due_status.ts";  ← from todo.due-status ^1.0.0 · built alongside by fune
import { type Todo } from "./todo_item.ts";  ← from todo.item ^1.0.0 · built alongside by fune

const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

/**
 * The short English label for a todo's due date. Built on dueStatus so the
 * label, the section and the overdue count never disagree. A year is added
 * only when the due date is in a different calendar year from today.
 */
export function dueLabel(todo: Todo, today: string): string {
  const status = dueStatus(todo, today);
  if (status === "done" || status === "none") return "";
  const due = todo.due as string;
  if (status === "overdue") {
    const late = daysBetween(due, today);
    return late === 1 ? "1 day overdue" : `${late} days overdue`;
  }
  if (status === "today") return "Due today";
  if (status === "tomorrow") return "Due tomorrow";
  const d = parseIsoDate(due);
  const label = `Due ${dayName(due).slice(0, 3)} ${d.day} ${MONTHS[d.month - 1]}`;
  return d.year === parseIsoDate(today).year ? label : `${label} ${d.year}`;
}