core/formatters/rate.formatter.ts

core/formatters/rate.formatter.ts is a file in Project Scripts. 56 lines of code and 14 definitions.

import { DATE_LENGTH, MS_PER_SECOND, RATE_SOURCE } from "#configuration/constants/rate.constants";
import type { GroupSummary, RateReport } from "#types/rate.types";
import {
    NO_RECORDS_CELLS,
    RATE_COLUMN,
    REPORT_TITLE,
    SELF_REPORTED_NOTE,
    TABLE_HEADER,
    UNKNOWN_UPDATE,
    countedLine,
    holdingLine,
    rateColumnNote,
    sourceLine,
} from "#configuration/strings/rate.strings";

const RATE_DIVIDER = " | ---:";
const TABLE_DIVIDER = "| --- | ---: | ---: | ---: | ---: | ---: | ---:";
const CELL = " | ";

export const dayOf = function dayOf(seconds: number): string {
    return new Date(seconds * MS_PER_SECOND).toISOString().slice(0, DATE_LENGTH);
};

const euro = function euro(value: number): string {
    return `€${Math.round(value).toLocaleString("en-US")}`;
};

const groupRow = function groupRow(summary: GroupSummary): string {
    const cells =
        summary.count === 0
            ? NO_RECORDS_CELLS
            : [summary.median, summary.p25, summary.p75, summary.p90, summary.highest].map(euro).join(CELL);
    const position = summary.below === null ? "" : `${CELL}${String(summary.below)}%`;
    return `| ${summary.label}${CELL}${String(summary.count)}${CELL}${cells}${position} |`;
};

const sourceLines = function sourceLines(report: RateReport): string[] {
    const dates = report.records.map((record) => record.createdAt).toSorted((left, right) => left - right);
    const first = dayOf(dates[0] ?? 0);
    const last = dayOf(dates.at(-1) ?? 0);
    return [
        sourceLine(RATE_SOURCE, report.fetchedOn),
        holdingLine(report.statedUpdate || UNKNOWN_UPDATE, report.records.length, first, last),
        countedLine(report.counted.length, report.months),
        SELF_REPORTED_NOTE,
    ];
};

export const formatReport = function formatReport(report: RateReport): string {
    const rated = report.rate !== null;
    return [
        REPORT_TITLE,
        "",
        ...sourceLines(report),
        ...(report.rate === null ? [] : ["", rateColumnNote(euro(report.rate))]),
        "",
        `${TABLE_HEADER}${rated ? RATE_COLUMN : ""} |`,
        `${TABLE_DIVIDER}${rated ? RATE_DIVIDER : ""} |`,
        ...report.groups.map(groupRow),
        "",
    ].join("\n");
};