import Alpaca from "@alpacahq/alpaca-trade-api"; const alpaca = new Alpaca({ keyId: process.env.ALPACA_API_KEY!, secretKey: process.env.ALPACA_SECRET_KEY!, baseUrl: process.env.ALPACA_BASE_URL || "https://paper-api.alpaca.markets", retryOnError: false, }); export async function loader({ params }: { params: { ticker: string } }) { const ticker = params.ticker?.toUpperCase(); if (!ticker) { return Response.json({ error: "Ticker is required" }, { status: 400 }); } try { // Get latest trade for current price const trade = await alpaca.getLatestTrade(ticker); const price = (trade as { Price?: number }).Price || 0; // Get historical bars for chart (last 30 days, daily) const bars = await alpaca.getBarsV2(ticker, { timeframe: "1Day", limit: 30, }); // Convert async generator to array const barsArray = []; for await (const bar of bars) { barsArray.push({ t: (bar as any).Timestamp || (bar as any).t, o: (bar as any).Open || (bar as any).o, h: (bar as any).High || (bar as any).h, l: (bar as any).Low || (bar as any).l, c: (bar as any).Close || (bar as any).c, v: (bar as any).Volume || (bar as any).v, }); } return Response.json({ ticker, price, bars: barsArray, }); } catch (error) { console.error("Alpaca data error:", error); return Response.json({ error: "Failed to fetch data" }, { status: 500 }); } }