- Add core.computed.json with 32 ratio definitions (filing + market derived) - Add Rust types for ComputedDefinition and ComputationSpec - Create generate-taxonomy.ts to generate TypeScript from Rust JSON - Generate lib/generated/ (gitignored) with surfaces, computed, kpis - Update financial-metrics.ts to use generated definitions - Add build-time generation via 'bun run generate' - Add taxonomy architecture documentation Two-phase ratio computation: - Filing-derived: margins, returns, per-share, growth (Rust computes) - Market-derived: valuation ratios (TypeScript computes with price data) All 32 ratios defined in core.computed.json: - Margins: gross, operating, ebitda, net, fcf - Returns: roa, roe, roic, roce - Financial health: debt_to_equity, net_debt_to_ebitda, cash_to_debt, current_ratio - Per-share: revenue, fcf, book_value - Growth: yoy metrics + 3y/5y cagr - Valuation: market_cap, ev, p/e, p/fcf, p/b, ev/sales, ev/ebitda, ev/fcf
34 lines
901 B
TypeScript
34 lines
901 B
TypeScript
import type {
|
|
FinancialStatementKind,
|
|
FinancialUnit
|
|
} from '@/lib/types';
|
|
import {
|
|
INCOME_SURFACES,
|
|
BALANCE_SURFACES,
|
|
CASH_FLOW_SURFACES
|
|
} from '@/lib/generated';
|
|
|
|
export type CanonicalRowDefinition = {
|
|
key: string;
|
|
label: string;
|
|
category: string;
|
|
order: number;
|
|
unit: FinancialUnit;
|
|
};
|
|
|
|
function toCanonicalRow(surface: { surface_key: string; label: string; category: string; order: number; unit: string }) {
|
|
return {
|
|
key: surface.surface_key,
|
|
label: surface.label,
|
|
category: surface.category,
|
|
order: surface.order,
|
|
unit: surface.unit as FinancialUnit
|
|
};
|
|
}
|
|
|
|
export const CANONICAL_ROW_DEFINITIONS: Record<Extract<FinancialStatementKind, 'income' | 'balance' | 'cash_flow'>, CanonicalRowDefinition[]> = {
|
|
income: INCOME_SURFACES.map(toCanonicalRow),
|
|
balance: BALANCE_SURFACES.map(toCanonicalRow),
|
|
cash_flow: CASH_FLOW_SURFACES.map(toCanonicalRow)
|
|
};
|