// src/main.ts async function fetchData() { const [recipesResponse, exchangesResponse] = await Promise.all([ fetch("https://api.prunplanner.org/data/recipes"), fetch("https://api.prunplanner.org/data/exchanges") ]); const [recipes, prices] = await Promise.all([ recipesResponse.json(), exchangesResponse.json() ]); return { recipes, prices }; } function render({ recipes, prices }) { const priceMap = new Map; for (const price of prices) if (price.ExchangeCode == "PP7D_IC1") priceMap.set(price.MaterialTicker, price.PriceAverage); const fmt = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 }); const tbody = document.querySelector("tbody"); tbody.innerHTML = ""; for (const recipe of recipes) { if (recipe.BuildingTicker !== "FRM") continue; const runsPerDay = 1000 * 60 * 60 * 24 / recipe.TimeMs; const revenuePerRun = recipe.Outputs.reduce((sum, output) => { const price = priceMap.get(output.Ticker); if (price === undefined) throw new Error(`missing price for ${output.Ticker}`); return sum + price * output.Amount; }, 0); const costPerRun = recipe.Inputs.reduce((sum, input) => { const price = priceMap.get(input.Ticker); if (price === undefined) throw new Error(`missing price for ${input.Ticker}`); return sum + price * input.Amount; }, 0); const row = document.createElement("tr"); row.innerHTML = `