* chore: repo-wide bloat sweep, remove dead code and fold duplicate helpers Remove 33 dead files, ~270 unreferenced exports/types, 13 dead i18n namespaces and 4 unused dependencies; fold byte-identical helper copies into one canonical home each (lib/utils chunk/sleep/utcDateStamp, lib/dates/iso, lib/invariants/uuid, lib/xml/escape, lib/reports/sru/format, lib/pdf/number-text, lib/browser/panel-request, lib/api/v1/body + v1ValidationError rolled out to ~55 v1 routes, booking-template schemas). No behaviour change: v1 bodies and status codes, MCP tool schemas, DB writes and money math are untouched. Naive ore rounding was deliberately not swapped for roundOre; see DECISIONS.md 2026-09-02 for the full list of things left alone on purpose. tsc, lint, 19588 unit tests and check:guards green; antipattern baseline ratcheted (naive-ore-round 622 -> 620, hand-rolled-invariant 115 -> 113). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * test(transactions): import RawTransaction from @/types after the ingest re-export removal CI's type ratchet (check:types, full tsconfig) caught the one test file that still imported the type through lib/transactions/ingest. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
import {
|
|
reportToWorkbook,
|
|
exportFilename,
|
|
UTF8_BOM,
|
|
} from '@/lib/reports/xlsx-export'
|
|
|
|
export type RegisterExportFormat = 'xlsx' | 'csv'
|
|
|
|
const XLSX_MIME = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
|
|
/** Normalize the `?format=` query param to a supported export format. */
|
|
export function parseExportFormat(raw: string | null): RegisterExportFormat {
|
|
return raw === 'csv' ? 'csv' : 'xlsx'
|
|
}
|
|
|
|
/**
|
|
* Build the download body + headers for a register export (customers,
|
|
* suppliers, articles) in either xlsx or csv. CSV is a single sheet with a
|
|
* UTF-8 BOM so Excel renders åäö correctly; both formats share the same
|
|
* column/row spec so files round-trip back through the importer.
|
|
*/
|
|
export function buildRegisterExport(
|
|
spec: Parameters<typeof reportToWorkbook>[0],
|
|
opts: { format: RegisterExportFormat; slug: string; companyName: string; date: string },
|
|
): { buffer: Buffer; contentType: string; filename: string } {
|
|
const { format, slug, companyName, date } = opts
|
|
|
|
if (format === 'csv') {
|
|
const buf = reportToWorkbook(spec, { bookType: 'csv' })
|
|
return {
|
|
buffer: Buffer.concat([Buffer.from(UTF8_BOM, 'utf-8'), buf]),
|
|
contentType: 'text/csv; charset=utf-8',
|
|
filename: exportFilename(slug, companyName, date, 'csv'),
|
|
}
|
|
}
|
|
|
|
return {
|
|
buffer: reportToWorkbook(spec),
|
|
contentType: XLSX_MIME,
|
|
filename: exportFilename(slug, companyName, date, 'xlsx'),
|
|
}
|
|
}
|
|
|
|
/** Today's date as `YYYY-MM-DD` for export filenames. */
|
|
export { todayIsoUtc as todayIso } from '@/lib/dates/iso'
|