diff --git a/app/globals.css b/app/globals.css index 96c00e1..54c54c6 100644 --- a/app/globals.css +++ b/app/globals.css @@ -331,47 +331,6 @@ textarea { color: #ff9f9f; } -.filter-chip { - display: inline-flex; - align-items: center; - gap: 0.375rem; - padding: 0.25rem 0.5rem; - border-radius: 0.5rem; - border: 1px solid var(--line-weak); - background: var(--panel-soft); - font-size: 0.6875rem; - font-family: var(--font-mono), monospace; - letter-spacing: 0.06em; - text-transform: uppercase; - color: var(--terminal-bright); - transition: - border-color 0.15s, - background-color 0.15s; -} - -.filter-chip:hover { - border-color: var(--line-strong); -} - -.filter-chip .remove { - display: flex; - align-items: center; - justify-content: center; - width: 14px; - height: 14px; - border-radius: 3px; - cursor: pointer; - opacity: 0.6; - transition: - opacity 0.15s, - background-color 0.15s; -} - -.filter-chip .remove:hover { - opacity: 1; - background: rgba(255, 255, 255, 0.1); -} - .section-divider { border-top: 1px solid var(--line-weak); margin-top: 1rem; diff --git a/components/analysis/valuation-stat-grid.tsx b/components/analysis/valuation-stat-grid.tsx deleted file mode 100644 index b44e749..0000000 --- a/components/analysis/valuation-stat-grid.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import type { CompanyValuationSnapshot } from '@/lib/types'; -import { formatCompactCurrency, formatScaledNumber } from '@/lib/format'; - -type ValuationStatGridProps = { - valuation: CompanyValuationSnapshot; -}; - -function formatRatio(value: number | null) { - return value === null ? 'n/a' : `${value.toFixed(2)}x`; -} - -function formatShares(value: number | null) { - return value === null ? 'n/a' : formatScaledNumber(value, { maximumFractionDigits: 2 }); -} - -export function ValuationStatGrid(props: ValuationStatGridProps) { - const items = [ - { label: 'Market cap', value: props.valuation.marketCap === null ? 'n/a' : formatCompactCurrency(props.valuation.marketCap) }, - { label: 'Enterprise value', value: props.valuation.enterpriseValue === null ? 'n/a' : formatCompactCurrency(props.valuation.enterpriseValue) }, - { label: 'Shares out.', value: formatShares(props.valuation.sharesOutstanding) }, - { label: 'Trailing P/E', value: formatRatio(props.valuation.trailingPe) }, - { label: 'EV / Revenue', value: formatRatio(props.valuation.evToRevenue) }, - { label: 'EV / EBITDA', value: formatRatio(props.valuation.evToEbitda) } - ]; - - return ( -
- {items.map((item) => ( -
-

{item.label}

-

{item.value}

-
- ))} -
- ); -} diff --git a/components/charts/hooks/use-chart-zoom.ts b/components/charts/hooks/use-chart-zoom.ts deleted file mode 100644 index adb2930..0000000 --- a/components/charts/hooks/use-chart-zoom.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { useState, useCallback } from 'react'; -import type { ChartZoomState } from '@/lib/types'; - -export function useChartZoom(dataLength: number) { - const [zoomState, setZoomState] = useState({ - startIndex: 0, - endIndex: Math.max(0, dataLength - 1), - isZoomed: false - }); - - const handleZoomChange = useCallback( - (brushData: { startIndex?: number; endIndex?: number }) => { - if ( - brushData.startIndex === undefined || - brushData.endIndex === undefined - ) { - return; - } - - setZoomState({ - startIndex: brushData.startIndex, - endIndex: brushData.endIndex, - isZoomed: - brushData.startIndex !== 0 || - brushData.endIndex !== dataLength - 1 - }); - }, - [dataLength] - ); - - const resetZoom = useCallback(() => { - setZoomState({ - startIndex: 0, - endIndex: Math.max(0, dataLength - 1), - isZoomed: false - }); - }, [dataLength]); - - return { - zoomState, - handleZoomChange, - resetZoom - }; -} diff --git a/components/charts/renderers/candlestick-chart-view.tsx b/components/charts/renderers/candlestick-chart-view.tsx deleted file mode 100644 index 90fb781..0000000 --- a/components/charts/renderers/candlestick-chart-view.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { - ComposedChart, - XAxis, - YAxis, - CartesianGrid, - Tooltip, - ResponsiveContainer, - Scatter -} from 'recharts'; -import type { ChartDataPoint } from '@/lib/types'; -import { getChartColors } from '../utils/chart-colors'; -import { ChartTooltip } from '../primitives/chart-tooltip'; -import { CandlestickShape } from '../utils/candlestick-shapes'; -import { isOHLCVData } from '../utils/chart-data-transformers'; - -type CandlestickChartViewProps = { - data: ChartDataPoint[]; - formatters?: { - price?: (value: number) => string; - date?: (value: string) => string; - volume?: (value: number) => string; - }; -}; - -export function CandlestickChartView({ - data, - formatters -}: CandlestickChartViewProps) { - const colors = getChartColors(); - - const ohlcvData = data.filter(isOHLCVData); - - if (ohlcvData.length === 0) { - return ( -
- Candlestick chart requires OHLCV data -
- ); - } - - return ( - - - - - - } - cursor={{ stroke: colors.muted, strokeDasharray: '3 3' }} - /> - } - isAnimationActive={false} - /> - - - ); -} diff --git a/components/charts/utils/candlestick-shapes.tsx b/components/charts/utils/candlestick-shapes.tsx deleted file mode 100644 index d7f2601..0000000 --- a/components/charts/utils/candlestick-shapes.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { getPriceChangeColor } from './chart-colors'; - -type CandlestickShapeProps = { - cx?: number; - payload?: { - open: number; - high: number; - low: number; - close: number; - }; -}; - -/** - * Custom candlestick shape component for Recharts - * Renders candlestick with wick and body - */ -export function CandlestickShape(props: CandlestickShapeProps) { - const { cx, payload } = props; - - if (!payload || !cx) return null; - - const { open, high, low, close } = payload; - const isPositive = close >= open; - const color = getPriceChangeColor(close - open); - - // Calculate positions - const bodyTop = Math.min(open, close); - const bodyBottom = Math.max(open, close); - const bodyHeight = Math.max(bodyBottom - bodyTop, 1); - - // Candlestick width - const width = 8; - - return ( - - {/* Upper wick */} - - - {/* Body */} - - - {/* Lower wick */} - - - ); -} diff --git a/components/charts/utils/chart-colors.ts b/components/charts/utils/chart-colors.ts index 81cc074..121878b 100644 --- a/components/charts/utils/chart-colors.ts +++ b/components/charts/utils/chart-colors.ts @@ -19,14 +19,6 @@ export function getChartColors(): ChartColorPalette { }; } -/** - * Get color for price change (positive/negative) - */ -export function getPriceChangeColor(change: number): string { - const colors = getChartColors(); - return change >= 0 ? colors.positive : colors.negative; -} - /** * Convert CSS variable to computed color value * Used for chart export since html-to-image can't render CSS variables diff --git a/components/dashboard/metric-card.tsx b/components/dashboard/metric-card.tsx deleted file mode 100644 index afa1eec..0000000 --- a/components/dashboard/metric-card.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { cn } from "@/lib/utils"; - -type MetricCardSize = "default" | "compact" | "inline"; - -type MetricCardProps = { - label: string; - value: string; - delta?: string; - positive?: boolean; - className?: string; - size?: MetricCardSize; -}; - -export function MetricCard({ - label, - value, - delta, - positive = true, - className, - size = "default", -}: MetricCardProps) { - if (size === "inline") { - return ( -
-

{label}

-

{value}

- {delta ? ( -

- {delta} -

- ) : null} -
- ); - } - - if (size === "compact") { - return ( -
-

- {label} -

-

- {value} -

- {delta ? ( -

- {delta} -

- ) : null} -
- ); - } - - return ( -
-

{label}

-

- {value} -

- {delta ? ( -

- {delta} -

- ) : null} -
- ); -} diff --git a/components/financials/control-bar.tsx b/components/financials/control-bar.tsx deleted file mode 100644 index f6a309d..0000000 --- a/components/financials/control-bar.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { Button } from "@/components/ui/button"; -import { cn } from "@/lib/utils"; - -type ControlButtonVariant = "primary" | "ghost" | "secondary" | "danger"; - -export type FinancialControlOption = { - value: string; - label: string; - disabled?: boolean; -}; - -export type FinancialControlSection = { - id: string; - label: string; - value: string; - options: FinancialControlOption[]; - onChange: (value: string) => void; -}; - -export type FinancialControlAction = { - id: string; - label: string; - onClick: () => void; - disabled?: boolean; - variant?: ControlButtonVariant; -}; - -type FinancialControlBarProps = { - title?: string; - subtitle?: string; - sections: FinancialControlSection[]; - actions?: FinancialControlAction[]; - className?: string; -}; - -export function FinancialControlBar({ - title = "Control Bar", - subtitle, - sections, - actions, - className, -}: FinancialControlBarProps) { - return ( -
-
-
-

- {title} -

- {subtitle ? ( -

- {subtitle} -

- ) : null} -
- - {actions && actions.length > 0 ? ( -
- {actions.map((action) => ( - - ))} -
- ) : null} -
- -
- {sections.map((section) => ( -
- - {section.label} - -
- {section.options.map((option) => ( - - ))} -
-
- ))} -
-
- ); -} diff --git a/components/ui/filter-chip.tsx b/components/ui/filter-chip.tsx deleted file mode 100644 index e66b56b..0000000 --- a/components/ui/filter-chip.tsx +++ /dev/null @@ -1,26 +0,0 @@ -"use client"; - -import { X } from "lucide-react"; -import { cn } from "@/lib/utils"; - -type FilterChipProps = { - label: string; - onRemove: () => void; - className?: string; -}; - -export function FilterChip({ label, onRemove, className }: FilterChipProps) { - return ( - - {label} - - - ); -} diff --git a/docs/DESIGN_SYSTEM.md b/docs/DESIGN_SYSTEM.md index 83b2556..2117b89 100644 --- a/docs/DESIGN_SYSTEM.md +++ b/docs/DESIGN_SYSTEM.md @@ -254,7 +254,7 @@ Rules: - use delta text only for meaningful comparison or trend context - reserve green and red text for clearly directional values -Reference implementation: `components/dashboard/metric-card.tsx` +Reference implementation: `components/dashboard/index-card-row.tsx` ### Tables diff --git a/hooks/use-task-poller.ts b/hooks/use-task-poller.ts deleted file mode 100644 index 09e0827..0000000 --- a/hooks/use-task-poller.ts +++ /dev/null @@ -1,64 +0,0 @@ -'use client'; - -import { useEffect, useRef, useState } from 'react'; -import { getTask } from '@/lib/api'; -import type { Task } from '@/lib/types'; - -type UseTaskPollerInput = { - taskId: string | null; - intervalMs?: number; - onTerminalState?: (task: Task) => void; -}; - -export function useTaskPoller({ taskId, intervalMs = 2200, onTerminalState }: UseTaskPollerInput) { - const [task, setTask] = useState(null); - const onTerminalStateRef = useRef(onTerminalState); - - useEffect(() => { - onTerminalStateRef.current = onTerminalState; - }, [onTerminalState]); - - useEffect(() => { - if (!taskId) { - setTask(null); - return; - } - - let stopped = false; - let timer: ReturnType | null = null; - - const poll = async () => { - try { - const { task: latest } = await getTask(taskId); - - if (stopped) { - return; - } - - setTask(latest); - - if (latest.status === 'completed' || latest.status === 'failed') { - onTerminalStateRef.current?.(latest); - return; - } - } catch { - if (stopped) { - return; - } - } - - timer = setTimeout(poll, intervalMs); - }; - - void poll(); - - return () => { - stopped = true; - if (timer) { - clearTimeout(timer); - } - }; - }, [taskId, intervalMs]); - - return task; -} diff --git a/knip.json b/knip.json index c9201d3..a6b28f8 100644 --- a/knip.json +++ b/knip.json @@ -1,5 +1,8 @@ { "$schema": "https://unpkg.com/knip@5/schema.json", + "entry": [ + "test/bun-test-shim.ts" + ], "tags": [ "-lintignore" ] diff --git a/lib/server/financials/canonical-definitions.ts b/lib/server/financials/canonical-definitions.ts deleted file mode 100644 index 6601cd8..0000000 --- a/lib/server/financials/canonical-definitions.ts +++ /dev/null @@ -1,33 +0,0 @@ -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, CanonicalRowDefinition[]> = { - income: INCOME_SURFACES.map(toCanonicalRow), - balance: BALANCE_SURFACES.map(toCanonicalRow), - cash_flow: CASH_FLOW_SURFACES.map(toCanonicalRow) -}; diff --git a/lib/server/repos/issuer-overlays.test.ts b/lib/server/repos/issuer-overlays.test.ts index 083eb21..07a7f84 100644 --- a/lib/server/repos/issuer-overlays.test.ts +++ b/lib/server/repos/issuer-overlays.test.ts @@ -9,11 +9,15 @@ import type { IssuerOverlayDiagnostics, IssuerOverlayStats, } from "@/lib/server/db/schema"; +import { + ensureIssuerOverlayRow, + getIssuerOverlay, + listIssuerOverlayRevisions, + publishIssuerOverlayRevision, +} from "./issuer-overlays"; let tempDir: string | null = null; let sqliteClient: Database | null = null; -let overlayRepo: typeof import("./issuer-overlays") | null = null; - function resetDbSingletons() { const globalState = globalThis as typeof globalThis & { __fiscalSqliteClient?: Database; @@ -90,8 +94,6 @@ describe("issuer overlay repo", () => { }; globalState.__fiscalSqliteClient = sqliteClient; globalState.__fiscalDrizzleDb = undefined; - - overlayRepo = await import("./issuer-overlays"); }); afterAll(() => { @@ -108,35 +110,27 @@ describe("issuer overlay repo", () => { }); it("creates an empty overlay row on ensure", async () => { - if (!overlayRepo) { - throw new Error("overlay repo not initialized"); - } - - const overlay = await overlayRepo.ensureIssuerOverlayRow("aapl"); + const overlay = await ensureIssuerOverlayRow("aapl"); expect(overlay?.ticker).toBe("AAPL"); expect(overlay?.status).toBe("empty"); expect(overlay?.active_revision).toBeNull(); }); it("publishes and deduplicates overlay revisions by content hash", async () => { - if (!overlayRepo) { - throw new Error("overlay repo not initialized"); - } - - const first = await overlayRepo.publishIssuerOverlayRevision({ + const first = await publishIssuerOverlayRevision({ ticker: "AAPL", definition: sampleDefinition(), diagnostics: sampleDiagnostics(), stats: sampleStats(), }); - const second = await overlayRepo.publishIssuerOverlayRevision({ + const second = await publishIssuerOverlayRevision({ ticker: "AAPL", definition: sampleDefinition(), diagnostics: sampleDiagnostics(), stats: sampleStats(), }); - const overlay = await overlayRepo.getIssuerOverlay("AAPL"); - const revisions = await overlayRepo.listIssuerOverlayRevisions("AAPL"); + const overlay = await getIssuerOverlay("AAPL"); + const revisions = await listIssuerOverlayRevisions("AAPL"); expect(first.published).toBe(true); expect(second.published).toBe(false); diff --git a/lib/server/repos/issuer-overlays.ts b/lib/server/repos/issuer-overlays.ts index 50acbeb..60a385e 100644 --- a/lib/server/repos/issuer-overlays.ts +++ b/lib/server/repos/issuer-overlays.ts @@ -11,7 +11,7 @@ import { type IssuerOverlayStats, } from "@/lib/server/db/schema"; -export type IssuerOverlayRevisionRecord = { +type IssuerOverlayRevisionRecord = { id: number; ticker: string; revision_number: number; @@ -22,7 +22,7 @@ export type IssuerOverlayRevisionRecord = { created_at: string; }; -export type IssuerOverlayRecord = { +type IssuerOverlayRecord = { ticker: string; status: "empty" | "active" | "error"; active_revision_id: number | null; diff --git a/lib/server/taxonomy/classifiers.ts b/lib/server/taxonomy/classifiers.ts deleted file mode 100644 index 1d9e8e0..0000000 --- a/lib/server/taxonomy/classifiers.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { FinancialStatementKind } from '@/lib/types'; - -export function classifyStatementRole(roleUri: string): FinancialStatementKind | null { - const normalized = roleUri.toLowerCase(); - - if (/cash\s*flow|statementsof?cashflows|netcash/.test(normalized)) { - return 'cash_flow'; - } - - if (/shareholders?|stockholders?|equity|retainedearnings/.test(normalized)) { - return 'equity'; - } - - if (/comprehensive\s*income/.test(normalized)) { - return 'comprehensive_income'; - } - - if (/balance\s*sheet|financial\s*position|assets?andliabilities/.test(normalized)) { - return 'balance'; - } - - if (/operations|income\s*statement|statementsofincome|profit/.test(normalized)) { - return 'income'; - } - - return null; -} - -export function conceptStatementFallback(localName: string): FinancialStatementKind | null { - const normalized = localName.toLowerCase(); - - if (/cash|operatingactivities|investingactivities|financingactivities/.test(normalized)) { - return 'cash_flow'; - } - - if (/equity|retainedearnings|additionalpaidincapital/.test(normalized)) { - return 'equity'; - } - - if (/comprehensiveincome/.test(normalized)) { - return 'comprehensive_income'; - } - - if (/asset|liabilit|debt/.test(normalized)) { - return 'balance'; - } - - if (/revenue|income|profit|expense|costof/.test(normalized)) { - return 'income'; - } - - return null; -} diff --git a/lib/server/taxonomy/types.ts b/lib/server/taxonomy/types.ts index 82ed1ce..a36a751 100644 --- a/lib/server/taxonomy/types.ts +++ b/lib/server/taxonomy/types.ts @@ -232,11 +232,6 @@ export type TaxonomyHydrationInput = { issuerOverlay?: IssuerOverlayDefinition | null; }; -export type TickerAutomationRequest = { - ticker: string; - source: TickerAutomationSource; -}; - export type TaxonomyHydrationResult = { filing_id: number; ticker: string; diff --git a/lib/server/utils/index.ts b/lib/server/utils/index.ts deleted file mode 100644 index 7b6f19e..0000000 --- a/lib/server/utils/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -export { - normalizeTicker, - normalizeTickerOrNull, - normalizeTags, - normalizeTagsOrNull, - normalizeOptionalString, - normalizeRecord, - normalizePositiveInteger, - nowIso, - todayIso -} from './normalize'; - -export { - asRecord, - asOptionalRecord, - asPositiveNumber, - asBoolean, - asStringArray, - asEnum -} from './validation'; - -export { withRetry, type RetryOptions } from './retry'; diff --git a/lib/server/utils/normalize.ts b/lib/server/utils/normalize.ts deleted file mode 100644 index ac6c607..0000000 --- a/lib/server/utils/normalize.ts +++ /dev/null @@ -1,51 +0,0 @@ -export function normalizeTicker(ticker: string): string { - return ticker.trim().toUpperCase(); -} - -export function normalizeTickerOrNull(ticker: unknown): string | null { - if (typeof ticker !== 'string') return null; - const normalized = ticker.trim().toUpperCase(); - return normalized || null; -} - -export function normalizeTags(tags?: unknown): string[] { - if (!Array.isArray(tags)) return []; - - const unique = new Set(); - for (const entry of tags) { - if (typeof entry !== 'string') continue; - const tag = entry.trim(); - if (tag) unique.add(tag); - } - return [...unique]; -} - -export function normalizeTagsOrNull(tags?: unknown): string[] | null { - const result = normalizeTags(tags); - return result.length > 0 ? result : null; -} - -export function normalizeOptionalString(value?: unknown): string | null { - if (typeof value !== 'string') return null; - const normalized = value.trim(); - return normalized || null; -} - -export function normalizeRecord(value?: unknown): Record | null { - if (!value || typeof value !== 'object' || Array.isArray(value)) return null; - return value as Record; -} - -export function normalizePositiveInteger(value?: unknown): number | null { - if (value === null || value === undefined || !Number.isFinite(value as number)) return null; - const normalized = Math.trunc(value as number); - return normalized > 0 ? normalized : null; -} - -export function nowIso(): string { - return new Date().toISOString(); -} - -export function todayIso(): string { - return new Date().toISOString().slice(0, 10); -} diff --git a/lib/server/utils/retry.ts b/lib/server/utils/retry.ts index 11ed175..8161561 100644 --- a/lib/server/utils/retry.ts +++ b/lib/server/utils/retry.ts @@ -1,10 +1,10 @@ -export interface RetryOptions { +type RetryOptions = { maxRetries: number; baseDelayMs: number; maxDelayMs: number; jitterFactor: number; retryableErrors: RegExp[]; -} +}; const DEFAULT_RETRY_OPTIONS: RetryOptions = { maxRetries: 3, diff --git a/lib/server/utils/validation.ts b/lib/server/utils/validation.ts deleted file mode 100644 index 08c2d64..0000000 --- a/lib/server/utils/validation.ts +++ /dev/null @@ -1,56 +0,0 @@ -export function asRecord(value: unknown): Record { - if (!value || typeof value !== 'object' || Array.isArray(value)) { - return {}; - } - return value as Record; -} - -export function asOptionalRecord(value: unknown): Record | null { - if (!value || typeof value !== 'object' || Array.isArray(value)) { - return null; - } - return value as Record; -} - -export function asPositiveNumber(value: unknown): number | null { - const parsed = typeof value === 'number' ? value : Number(value); - return Number.isFinite(parsed) && parsed > 0 ? parsed : null; -} - -export function asBoolean(value: unknown, fallback = false): boolean { - if (typeof value === 'boolean') { - return value; - } - - if (typeof value === 'string') { - const normalized = value.trim().toLowerCase(); - if (normalized === 'true' || normalized === '1' || normalized === 'yes') { - return true; - } - if (normalized === 'false' || normalized === '0' || normalized === 'no') { - return false; - } - } - - return fallback; -} - -export function asStringArray(value: unknown): string[] { - const source = Array.isArray(value) - ? value - : typeof value === 'string' - ? value.split(',') - : []; - - const unique = new Set(); - for (const entry of source) { - if (typeof entry !== 'string') continue; - const tag = entry.trim(); - if (tag) unique.add(tag); - } - return [...unique]; -} - -export function asEnum(value: unknown, allowed: readonly T[]): T | undefined { - return allowed.includes(value as T) ? (value as T) : undefined; -} diff --git a/rust/fiscal-xbrl-core/src/taxonomy_loader.rs b/rust/fiscal-xbrl-core/src/taxonomy_loader.rs index b7a05ce..ea36864 100644 --- a/rust/fiscal-xbrl-core/src/taxonomy_loader.rs +++ b/rust/fiscal-xbrl-core/src/taxonomy_loader.rs @@ -281,10 +281,6 @@ pub fn resolve_taxonomy_dir() -> Result { }) } -pub fn load_surface_pack(pack: FiscalPack) -> Result { - load_surface_pack_with_overlays(pack, None, None) -} - pub fn load_surface_pack_with_overlays( pack: FiscalPack, ticker: Option<&str>, @@ -651,8 +647,8 @@ mod tests { resolve_taxonomy_dir().expect("taxonomy dir should resolve during tests"); assert!(taxonomy_dir.exists()); - let surface_pack = - load_surface_pack(FiscalPack::Core).expect("core surface pack should load"); + let surface_pack = load_surface_pack_with_overlays(FiscalPack::Core, None, None) + .expect("core surface pack should load"); assert_eq!(surface_pack.pack, "core"); assert!(!surface_pack.surfaces.is_empty()); @@ -704,7 +700,7 @@ mod tests { ]; for pack in packs { - let surface_pack = load_surface_pack(pack) + let surface_pack = load_surface_pack_with_overlays(pack, None, None) .unwrap_or_else(|error| panic!("surface pack {} failed: {error}", pack.as_str())); assert_eq!(surface_pack.pack, pack.as_str()); assert!(