import { serve } from "bun"; import packages from "../database/packages.json"; import programs from "../database/programs.json"; serve({ port: 3000, fetch(req) { const url = new URL(req.url); const pathname = url.pathname; const q = url.searchParams.get("q")?.trim().toLowerCase(); const filter = url.searchParams.get("filter")?.trim().toLowerCase(); const corsHeaders = { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", }; // CORS preflight handling if (req.method === "OPTIONS") { return new Response(null, { status: 204, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET, POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type", }, }); } if (pathname === "/api/searchPackages") { const results = packages.filter( ({ name, full_name, description, topics }) => { if ( filter && !topics?.some((t: string) => t.toLowerCase() === filter) ) return false; if (!q) return true; return [name, full_name, description, ...(topics || [])].some( (field: string) => field?.toLowerCase().includes(q), ); }, ); return new Response(JSON.stringify(results.slice(0, 25)), { status: 200, headers: corsHeaders, }); } if (pathname === "/api/searchProgams") { const results = programs.filter(({ full_name, description, topics }) => { if (filter && !topics?.some((t: string) => t.toLowerCase() === filter)) return false; if (!q) return true; return [full_name, description, ...(topics || [])].some( (field: string) => field?.toLowerCase().includes(q), ); }); return new Response(JSON.stringify(results.slice(0, 25)), { status: 200, headers: corsHeaders, }); } if (pathname === "/api/infiniteScrollPackages") { const pageNumberParam = url.searchParams.get("pageNumber"); const pageNumber = parseInt(pageNumberParam || "0", 10); if (isNaN(pageNumber) || pageNumber < 0) { return new Response(JSON.stringify({ error: "Invalid page number" }), { status: 400, headers: corsHeaders, }); } const lowerLimit = pageNumber * 10; const scrollResults = packages.slice(lowerLimit, lowerLimit + 10); return new Response(JSON.stringify(scrollResults), { status: 200, headers: corsHeaders, }); } if (pathname === "/api/infiniteScrollPrograms") { const section = url.searchParams.get("section"); const [ll, ul] = (url.searchParams.get("range") || "") .split("..") .map(Number); if (!section || isNaN(ll) || isNaN(ul)) { return new Response(JSON.stringify([]), { status: 400, headers: corsHeaders, }); } const getSortedResponse = (sortFn: Function) => new Response(JSON.stringify([...programs].sort(sortFn).slice(ll, ul)), { status: 200, headers: corsHeaders, }); if (section === "mostUsed") { return getSortedResponse( (a: any, b: any) => b.stargazers_count - a.stargazers_count, ); } if (section === "latestRepos") { return getSortedResponse( (a: any, b: any) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime(), ); } return new Response(JSON.stringify([]), { status: 400, headers: corsHeaders, }); } return new Response("Not Found", { status: 404, headers: { "Access-Control-Allow-Origin": "*" }, }); }, });