import { escapeHTML } from "bun" import { readdirSync } from "fs" import { join, extname } from "path" import type { CommandOutput } from "@/shared/types" import { NOSE_WWW } from "@/config" import { getState } from "@/state" import { appPath } from "@/webapp" import { isBinaryFile } from "@/utils" import { countChar } from "@/shared/utils" export default async function (path: string) { const state = getState() if (!state) return { error: "no state" } const project = state.project if (!project) return { error: "no project loaded" } const root = appPath(project) if (!root) return { error: "error loading project" } let files: string[] = [] for (const file of readdirSync(root, { withFileTypes: true })) { files.push(file.name) } if (root === NOSE_WWW) { files = files.filter(file => file.endsWith(`${project}.ts`) || file.endsWith(`${project}.tsx`)) } if (!files.includes(path)) return { error: `file not found: ${path}` } return await readFile(join(root, path)) } async function readFile(path: string): Promise { const ext = extname(path).slice(1) const file = Bun.file(path) switch (ext) { case "jpeg": case "jpg": case "png": case "gif": case "webp": const img = await file.arrayBuffer() return { html: `` } case "mp3": case "wav": case "mp4": case "mov": case "avi": case "mkv": case "webm": return "Not implemented" default: if (await isBinaryFile(path)) throw "Cannot display binary file" const text = await file.text() const rows = countChar(text, "\n") + 1 return { html: `` } } }