nose-pluto/app/nose/bin/edit.tsx
2025-09-28 15:53:45 -07:00

48 lines
1.4 KiB
TypeScript

import { readdirSync } from "fs"
import { join, extname } from "path"
import type { CommandOutput } from "app/src/shared/types"
import { NOSE_WWW } from "app/src/config"
import { isBinaryFile } from "app/src/utils"
import { countChar } from "app/src/shared/utils"
import { projectName, projectDir } from "@/project"
import { getState } from "@/session"
export default async function (path: string) {
const project = projectName()
const root = getState("cwd") || projectDir()
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 await readFile(join(root, path))
else
return await newFile(join(root, path))
}
async function readFile(path: string): Promise<CommandOutput> {
const ext = extname(path).slice(1)
const file = Bun.file(path)
if (await isBinaryFile(path))
throw "Cannot display binary file"
const text = await file.text()
const rows = countChar(text, "\n") + 1
return <textarea class="editor" spellcheck={false} rows={rows} data-path={path}>{text}</textarea>
}
async function newFile(path: string): Promise<CommandOutput> {
return <textarea class="editor" spellcheck={false} rows={1} data-path={path}></textarea>
}