diff --git a/packages/backend/src/nwscript/resref-index.ts b/packages/backend/src/nwscript/resref-index.ts new file mode 100644 index 0000000..9bbf981 --- /dev/null +++ b/packages/backend/src/nwscript/resref-index.ts @@ -0,0 +1,54 @@ +import fs from "fs/promises"; +import path from "path"; + +interface ResrefEntry { + resref: string; + type: string; + filePath: string; + displayName?: string; +} + +const index = new Map(); + +export async function buildResrefIndex(repoPath: string): Promise { + index.clear(); + try { + await scanDir(repoPath, repoPath); + } catch { + // repo not cloned yet — that's fine + } +} + +async function scanDir(dir: string, rootPath: string): Promise { + let entries; + try { + entries = await fs.readdir(dir, { withFileTypes: true }); + } catch { + return; + } + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (entry.name === "node_modules" || entry.name === ".git" || entry.name === ".nasher") continue; + await scanDir(fullPath, rootPath); + } else if (entry.name.endsWith(".json")) { + const match = entry.name.match(/^(.+)\.(utc|uti|utp|are|dlg|utm|ute)\.json$/); + if (match) { + const [, resref, type] = match; + index.set(resref, { + resref, + type, + filePath: path.relative(rootPath, fullPath), + }); + } + } + } +} + +export function lookupResref(resref: string): ResrefEntry | undefined { + return index.get(resref); +} + +export function getResrefCount(): number { + return index.size; +} diff --git a/packages/backend/src/routes/editor.ts b/packages/backend/src/routes/editor.ts index 2e3d083..cb65c29 100644 --- a/packages/backend/src/routes/editor.ts +++ b/packages/backend/src/routes/editor.ts @@ -5,6 +5,7 @@ import { writeFile, deleteFile, } from "../services/editor.service.js"; +import { lookupResref, getResrefCount } from "../nwscript/resref-index.js"; const router = Router(); @@ -48,4 +49,17 @@ router.delete("/file/:repo/*path", async (req, res) => { } }); +router.get("/resref/:resref", (req, res) => { + const entry = lookupResref(req.params.resref); + if (entry) { + res.json(entry); + } else { + res.status(404).json({ error: "resref not found" }); + } +}); + +router.get("/resref-count", (_req, res) => { + res.json({ count: getResrefCount() }); +}); + export default router;