repoview 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,40 @@
3
3
  All notable changes to this project are documented here. This project adheres to
4
4
  [Semantic Versioning](https://semver.org/).
5
5
 
6
+ ## 0.6.1 — 2026-06-27
7
+
8
+ ### Added
9
+ - **Ephemeral gists.** Publish an arbitrary file (usually Markdown) to a running
10
+ session and get a shareable preview URL — for agents that generate a doc and
11
+ want the user to read it.
12
+ - `POST /api/gists` `{content, filename?, title?, ttlSeconds?}` → `{id, url, rawUrl, expiresAt}`
13
+ - `GET /gist/:id` (rendered preview), `GET /gist/:id/raw`, `GET /gists` (list)
14
+ - **Editable & deletable** (GitHub-gist-shaped): `PATCH /api/gists/:id`,
15
+ `DELETE /api/gists/:id`, `GET /api/gists` (JSON list), an `/gist/:id/edit`
16
+ form, and Edit/Delete buttons on the preview page.
17
+ - CLI: `repoview gist <file>` (create) plus `gist edit <id> [file]`,
18
+ `gist delete <id>`, `gist list` — all also work via `--url` against a remote
19
+ server. Create/edit read from a file or stdin.
20
+ - Gists are **in memory only** (don't survive a restart) and expire after a TTL
21
+ (default 24h, clamped 1m–7d); capped at 1 MB / 500 gists.
22
+ - **`REPOVIEW_BASE_URL`** env var sets the absolute origin used in returned gist
23
+ URLs (so a remotely-running server returns clickable links). Falls back to the
24
+ request `Host` header.
25
+ - A **Gists** link in the top bar (and on the session page) → the `/gists` list.
26
+
27
+ ### Changed
28
+ - **Scoped live reload.** A page now reloads only for changes relevant to it: a
29
+ file view reloads on its exact file, a directory view on its direct children,
30
+ and repo-wide views (diff, broken-links) on any change. Previously any edit
31
+ reloaded every open page of that repo. Gist/session pages no longer live-reload
32
+ (their content is static), which also removes spurious reloads of open gist
33
+ tabs when the default repo changed.
34
+ - **Rewrote `--help`** to be comprehensive and agent-friendly: documents the
35
+ daemon lifecycle (first run is the foreground server; later runs exit), all
36
+ subcommands and their daemon/`--repo` requirements, the HTTP control + gist API
37
+ with example payloads, the page map, and env vars (incl. that
38
+ `REPOVIEW_BASE_URL` is read by the server, not the client).
39
+
6
40
  ## 0.6.0 — 2026-06-04
7
41
 
8
42
  ### Added
package/DEVELOPMENT.md CHANGED
@@ -10,6 +10,7 @@ This doc collects the “how it works” details so `README.md` can stay product
10
10
  - `src/repo-context.ts`: per-repo runtime state (git info, gitignore matcher, link scanner, reload hub, file watcher)
11
11
  - `src/repo-router.ts`: the per-repo routes (`/tree`, `/blob`, `/raw`, `/diff`, `/review`, `/events`, …) as a router that resolves `/r/:repoId` → a per-repo child router
12
12
  - `src/net.ts`: loopback helpers (control-endpoint guard, bind-host check)
13
+ - `src/gists.ts` / `src/gist-router.ts`: in-memory ephemeral gist store (TTL, expiry sweeper) and its routes
13
14
  - `src/types.ts`: shared interfaces (`RepoContext`, `Session`/`RepoSummary`, `GitInfo`, `MarkdownRenderer`, `LinkScanner`, …)
14
15
  - `src/git.ts` / `src/paths.ts` / `src/format.ts` / `src/csv.ts` / `src/reload.ts`: extracted helpers (git CLI, path safety, byte/date formatting, CSV parsing, SSE reload hub)
15
16
  - `src/markdown.ts`: Markdown rendering + link/image rewriting (repo-prefixed) + sanitization
@@ -69,6 +70,19 @@ Session-level routes:
69
70
  - `GET /api/session`: session signature + repo list (also the join handshake)
70
71
  - `GET /api/repos`, `POST /api/repos`, `DELETE /api/repos/:id`, `POST /api/shutdown`: control API (mutations are loopback-only)
71
72
 
73
+ Gist routes (ephemeral published files, in-memory, default 24h TTL):
74
+ - `GET /api/gists`: list gists as JSON
75
+ - `POST /api/gists`: publish `{content, filename?, title?, ttlSeconds?}` → `{id, url, rawUrl, expiresAt}`
76
+ - `PATCH /api/gists/:id`: edit `{content?, filename?, title?, ttlSeconds?}` → updated gist
77
+ - `DELETE /api/gists/:id`: delete
78
+ - `GET /gist/:id`: rendered preview (Markdown or highlighted code) with Edit/Delete
79
+ - `GET /gist/:id/edit`: edit form
80
+ - `GET /gist/:id/raw`: raw source
81
+ - `GET /gists`: list of active gists
82
+
83
+ `REPOVIEW_BASE_URL` sets the absolute origin used in returned gist URLs (falls
84
+ back to the request `Host` header).
85
+
72
86
  ## Link rewriting rules
73
87
 
74
88
  `src/markdown.ts` rewrites relative Markdown links so they stay inside the repo UI:
package/README.md CHANGED
@@ -69,6 +69,41 @@ Use `--port` to run independent sessions side by side.
69
69
  > the `/session` page is read-only for remote viewers. Use `--host 127.0.0.1` to
70
70
  > keep a session fully local.
71
71
 
72
+ ## Gists (ephemeral file previews)
73
+
74
+ Publish an arbitrary file (usually Markdown) to a running session and get a
75
+ shareable preview URL — handy for agents that generate a doc and want the user to
76
+ read it. Gists live **in memory only** (they don't survive a restart) and expire
77
+ after a TTL (default **24h**).
78
+
79
+ ```bash
80
+ repoview gist NOTES.md --title "Release plan" # prints a preview URL
81
+ cat report.md | repoview gist --filename report.md # from stdin
82
+ repoview gist out.md --ttl 2h # custom TTL (1m–7d)
83
+ repoview gist edit <id> NOTES.md # replace content
84
+ repoview gist delete <id> # delete
85
+ repoview gist list # list active gists
86
+ ```
87
+
88
+ Gists are **editable and deletable** (like GitHub gists): the preview page has
89
+ Edit/Delete buttons, and the HTTP API supports `PATCH`/`DELETE /api/gists/:id`.
90
+
91
+ Or over HTTP (e.g. from a remote agent):
92
+
93
+ ```bash
94
+ curl -X POST "$BASE/api/gists" -H 'content-type: application/json' \
95
+ -d '{"content":"# Hi","filename":"hi.md","ttlSeconds":3600}'
96
+ # → { "url": "…/gist/<id>", "rawUrl": "…/gist/<id>/raw", "expiresAt": "…" }
97
+ ```
98
+
99
+ All gists are listed at **`/gists`** (linked from the top bar) so the user can
100
+ always find them. Set **`REPOVIEW_BASE_URL`** so a remotely-running server returns
101
+ absolute, clickable URLs:
102
+
103
+ ```bash
104
+ REPOVIEW_BASE_URL=https://repoview.example.com repoview --host 0.0.0.0
105
+ ```
106
+
72
107
  ## Why
73
108
 
74
109
  - Keep GitHub as a remote, not your developer portal.
package/dist/cli.js CHANGED
@@ -5,38 +5,84 @@ import { startServer } from "./server.js";
5
5
  import { handleReviewCommand } from "./review-cli.js";
6
6
  function printHelp() {
7
7
  // Keep this in sync with README.md
8
- process.stdout.write(`repoview
8
+ process.stdout.write(`repoview — browse local Git repos as a GitHub-like website, and publish
9
+ ephemeral file previews ("gists"). Built to be driven by humans and agents.
9
10
 
10
- Serve local Git repositories as a GitHub-like website. Multiple invocations on
11
- the same port join one shared session (like tmux) the first run starts the
12
- daemon, later runs register their repo and exit.
11
+ SESSION MODEL (like tmux)
12
+ Invocations on the same port share ONE session (daemon). The FIRST run starts
13
+ the daemon and KEEPS RUNNING in the foreground (it is the server). LATER runs
14
+ on that port just register their repo and exit 0 immediately. So you never have
15
+ to remember a port per repo. Each repo is served at /r/<id>/...
16
+ Default port: 7376. Use --port for independent sessions.
17
+ Agent tip: background the first run (e.g. \`repoview … &\` or nohup); once it
18
+ prints "listening:", the daemon is up and all other commands below will work.
13
19
 
14
- Usage:
15
- npx repoview [--repo /path/to/repo] [--host 0.0.0.0] [--port 7376] [--no-watch]
16
- repoview [--repo /path/to/repo] [--host 0.0.0.0] [--port 7376] [--no-watch]
20
+ START / JOIN A SESSION
21
+ repoview [--repo PATH] [--host HOST] [--port N] [--no-watch]
22
+ If no daemon is on --port: becomes the daemon (blocks/foreground).
23
+ If a daemon is already there: registers the repo, prints its URL, exits 0.
17
24
 
18
- Options:
19
- --repo <path> Repository root (default: REPO_ROOT or current dir)
20
- --host <host> Bind address (default: 0.0.0.0)
21
- --port <port> Bind/session port (default: 7376)
22
- --watch Enable live reload (default)
23
- --no-watch Disable live reload
24
- -h, --help Show this help
25
+ Options:
26
+ --repo <path> Repo root (default: $REPO_ROOT or current dir)
27
+ --host <host> Bind address (default: 0.0.0.0; use 127.0.0.1 for local-only)
28
+ --port <port> Session port (default: 7376)
29
+ --no-watch Disable live reload for this repo
30
+ -h, --help Show this help
25
31
 
26
- Session subcommands (target the daemon on --port):
27
- repoview ls List repos in the session
28
- repoview rm <id|path> Unregister a repo from the session
29
- repoview stop Shut the session daemon down
32
+ MANAGE THE SESSION (require a running daemon on --port)
33
+ repoview ls List repos: "<id> <branch> <path>" + each URL
34
+ repoview rm <id|path> Unregister a repo
35
+ repoview stop Shut the session daemon down
30
36
 
31
- Review subcommands:
32
- repoview review new --title "Title" Create a new review thread
33
- repoview review post <id> --role agent --body "" Post a message to a thread
34
- repoview review post <id> --role agent --file f Post from file
35
- repoview review read <id> Read thread messages + comments
36
- repoview review list List all threads
37
+ GISTS (ephemeral file previews; default TTL 24h, gone on restart, editable)
38
+ Need a running daemon on --port (or --url for a remote server's API).
39
+ repoview gist <file> [--title "T"] [--ttl 24h] [--filename name.md] [--url URL]
40
+ Publish; prints ONE line: the URL.
41
+ cat report.md | repoview gist --filename report.md Publish from stdin
42
+ repoview gist edit <id> [file] [--title] [--filename] [--ttl] Update a gist
43
+ repoview gist delete <id> Delete a gist
44
+ repoview gist list List gists
45
+ --ttl accepts 30m/24h/7d/seconds (1m–7d). --title is the page/list label
46
+ only; the rendered H1 comes from the file's own first Markdown heading.
37
47
 
38
- Environment:
39
- REPO_ROOT, HOST, PORT
48
+ CODE REVIEW THREADS (pure filesystem, NO daemon — operate on a repo's .repoview/)
49
+ Add --repo <path> to EVERY review command (default: $REPO_ROOT or cwd — NOT the
50
+ session's served repo). --port/--host are ignored here.
51
+ repoview review new --repo R --title "Title" Create (prints id)
52
+ repoview review post --repo R <id> --role agent --body "…" Post a message
53
+ repoview review post --repo R <id> --role agent --file F Post from file/stdin
54
+ repoview review read --repo R <id> Print thread JSON
55
+ repoview review list --repo R List threads (JSON)
56
+
57
+ HTTP API (for agents / remote use — base = http://<host>:<port>)
58
+ GET /api/session {app, version, repos:[{id,name,path,branch}]}
59
+ GET /api/repos {repos:[…]}
60
+ POST /api/repos {path, watch?} → {id, url} (localhost only)
61
+ DELETE /api/repos/:id → {ok} (localhost only)
62
+ POST /api/shutdown → {ok} (localhost only)
63
+ GET /api/gists {gists:[{id,filename,title,url,expiresAt}]}
64
+ POST /api/gists {content, filename?, title?, ttlSeconds?}
65
+ → {id, url, rawUrl, expiresAt}
66
+ PATCH /api/gists/:id {content?, filename?, title?, ttlSeconds?} → gist
67
+ DELETE /api/gists/:id → {ok}
68
+ Examples:
69
+ curl -s $BASE/api/session
70
+ curl -s -X POST $BASE/api/gists -H 'content-type: application/json' \\
71
+ -d '{"content":"# Hi","filename":"hi.md","ttlSeconds":3600}'
72
+
73
+ PAGES
74
+ / → default repo /session manage repos (add/remove)
75
+ /r/<id>/tree/ browse a repo /gists list of active gists
76
+ /r/<id>/diff working-tree diff /gist/<id> a gist preview (+ /raw)
77
+ /r/<id>/review/ review threads
78
+
79
+ ENVIRONMENT
80
+ REPO_ROOT Default repo when --repo is omitted
81
+ HOST, PORT Default bind host / session port
82
+ REPOVIEW_BASE_URL Absolute origin used in returned gist URLs. Read by the
83
+ SERVER/daemon at request time — set it when STARTING the
84
+ daemon, not on the gist client. Falls back to the request
85
+ Host header. (e.g. when the server runs remotely)
40
86
  `);
41
87
  }
42
88
  function parseArgs(argv) {
@@ -165,6 +211,185 @@ async function runSubcommand(sub, args, base, port, host) {
165
211
  printHelp();
166
212
  return 1;
167
213
  }
214
+ /** Parse "24h" / "30m" / "7d" / "3600" into seconds. */
215
+ function parseDuration(text) {
216
+ const m = String(text).trim().match(/^(\d+)\s*([smhd]?)$/i);
217
+ if (!m)
218
+ return undefined;
219
+ const n = Number(m[1]);
220
+ const unit = m[2].toLowerCase();
221
+ const mult = unit === "d" ? 86400 : unit === "h" ? 3600 : unit === "m" ? 60 : 1;
222
+ return n * mult;
223
+ }
224
+ function parseGistArgs(args) {
225
+ const flags = {};
226
+ const positional = [];
227
+ for (let i = 0; i < args.length; i++) {
228
+ const v = args[i];
229
+ if (v === "--title")
230
+ flags.title = args[++i];
231
+ else if (v === "--ttl")
232
+ flags.ttl = args[++i];
233
+ else if (v === "--filename")
234
+ flags.filename = args[++i];
235
+ else if (v === "--url")
236
+ flags.url = args[++i];
237
+ else
238
+ positional.push(v);
239
+ }
240
+ return { flags, positional };
241
+ }
242
+ /** Read content from a file path, else stdin if piped, else undefined. */
243
+ async function readGistContent(file) {
244
+ if (file) {
245
+ const fs = await import("node:fs/promises");
246
+ return fs.readFile(file, "utf8");
247
+ }
248
+ if (!process.stdin.isTTY) {
249
+ const chunks = [];
250
+ for await (const chunk of process.stdin)
251
+ chunks.push(chunk);
252
+ return Buffer.concat(chunks).toString("utf8");
253
+ }
254
+ return undefined;
255
+ }
256
+ function ttlSecondsFrom(flags) {
257
+ if (!flags.ttl)
258
+ return undefined;
259
+ const s = parseDuration(flags.ttl);
260
+ if (s == null) {
261
+ process.stderr.write(`Invalid --ttl: ${flags.ttl} (use e.g. 30m, 24h, 7d)\n`);
262
+ return null; // signal error
263
+ }
264
+ return s;
265
+ }
266
+ function gistTarget(flags, localBase) {
267
+ return flags.url ? flags.url.replace(/\/+$/, "") : localBase;
268
+ }
269
+ function noSession(target) {
270
+ process.stderr.write(`No repoview session at ${target}. Start one with \`repoview\` first, or pass --url.\n`);
271
+ return 1;
272
+ }
273
+ async function runGist(restArgs, localBase) {
274
+ const sub = restArgs[0];
275
+ if (sub === "edit")
276
+ return runGistEdit(restArgs.slice(1), localBase);
277
+ if (sub === "delete" || sub === "rm")
278
+ return runGistDelete(restArgs.slice(1), localBase);
279
+ if (sub === "list" || sub === "ls")
280
+ return runGistList(restArgs.slice(1), localBase);
281
+ return runGistCreate(sub === "create" ? restArgs.slice(1) : restArgs, localBase);
282
+ }
283
+ async function runGistCreate(args, localBase) {
284
+ const { flags, positional } = parseGistArgs(args);
285
+ const file = positional[0];
286
+ const content = await readGistContent(file);
287
+ if (!content || !content.trim()) {
288
+ process.stderr.write("Error: no content (pass a file or pipe via stdin)\n");
289
+ return 1;
290
+ }
291
+ const ttlSeconds = ttlSecondsFrom(flags);
292
+ if (ttlSeconds === null)
293
+ return 1;
294
+ const filename = flags.filename || (file ? path.basename(file) : "gist.md");
295
+ const target = gistTarget(flags, localBase);
296
+ let result;
297
+ try {
298
+ result = (await fetchJson(`${target}/api/gists`, {
299
+ method: "POST",
300
+ headers: { "Content-Type": "application/json" },
301
+ body: JSON.stringify({ content, filename, title: flags.title, ttlSeconds }),
302
+ }));
303
+ }
304
+ catch (e) {
305
+ process.stderr.write(`Error: ${e.message}\n`);
306
+ return 1;
307
+ }
308
+ if (!result)
309
+ return noSession(target);
310
+ process.stdout.write(`${result.url}\n`);
311
+ return 0;
312
+ }
313
+ async function runGistEdit(args, localBase) {
314
+ const { flags, positional } = parseGistArgs(args);
315
+ const id = positional[0];
316
+ if (!id) {
317
+ process.stderr.write("Usage: repoview gist edit <id> [file] [--title] [--filename] [--ttl]\n");
318
+ return 1;
319
+ }
320
+ const content = await readGistContent(positional[1]);
321
+ const ttlSeconds = ttlSecondsFrom(flags);
322
+ if (ttlSeconds === null)
323
+ return 1;
324
+ const body = {};
325
+ if (content !== undefined)
326
+ body.content = content;
327
+ if (flags.filename !== undefined)
328
+ body.filename = flags.filename;
329
+ if (flags.title !== undefined)
330
+ body.title = flags.title;
331
+ if (ttlSeconds !== undefined)
332
+ body.ttlSeconds = ttlSeconds;
333
+ if (Object.keys(body).length === 0) {
334
+ process.stderr.write("Nothing to update (pass new content, --title, --filename, or --ttl)\n");
335
+ return 1;
336
+ }
337
+ const target = gistTarget(flags, localBase);
338
+ let result;
339
+ try {
340
+ result = (await fetchJson(`${target}/api/gists/${encodeURIComponent(id)}`, {
341
+ method: "PATCH",
342
+ headers: { "Content-Type": "application/json" },
343
+ body: JSON.stringify(body),
344
+ }));
345
+ }
346
+ catch (e) {
347
+ process.stderr.write(`Error: ${e.message}\n`);
348
+ return 1;
349
+ }
350
+ if (!result)
351
+ return noSession(target);
352
+ process.stdout.write(`${result.url}\n`);
353
+ return 0;
354
+ }
355
+ async function runGistDelete(args, localBase) {
356
+ const { flags, positional } = parseGistArgs(args);
357
+ const id = positional[0];
358
+ if (!id) {
359
+ process.stderr.write("Usage: repoview gist delete <id>\n");
360
+ return 1;
361
+ }
362
+ const target = gistTarget(flags, localBase);
363
+ try {
364
+ const result = await fetchJson(`${target}/api/gists/${encodeURIComponent(id)}`, {
365
+ method: "DELETE",
366
+ });
367
+ if (!result)
368
+ return noSession(target);
369
+ }
370
+ catch (e) {
371
+ process.stderr.write(`Error: ${e.message}\n`);
372
+ return 1;
373
+ }
374
+ process.stdout.write(`Deleted ${id}\n`);
375
+ return 0;
376
+ }
377
+ async function runGistList(args, localBase) {
378
+ const { flags } = parseGistArgs(args);
379
+ const target = gistTarget(flags, localBase);
380
+ const result = (await fetchJson(`${target}/api/gists`));
381
+ if (!result)
382
+ return noSession(target);
383
+ const gists = result.gists || [];
384
+ if (!gists.length) {
385
+ process.stdout.write("(no active gists)\n");
386
+ return 0;
387
+ }
388
+ for (const g of gists) {
389
+ process.stdout.write(`${g.id.padEnd(14)} ${(g.title || g.filename).padEnd(28)} ${g.url || ""}\n`);
390
+ }
391
+ return 0;
392
+ }
168
393
  const parsed = parseArgs(process.argv.slice(2));
169
394
  const { repo, port: portArg, host: hostArg, watch, help } = parsed;
170
395
  if (help) {
@@ -189,6 +414,11 @@ if (["ls", "rm", "stop"].includes(parsed.rest[0])) {
189
414
  const code = await runSubcommand(parsed.rest[0], parsed, base, port, host);
190
415
  process.exit(code);
191
416
  }
417
+ // Publish an ephemeral gist to the session daemon.
418
+ if (parsed.rest[0] === "gist") {
419
+ const code = await runGist(parsed.rest.slice(1), base);
420
+ process.exit(code);
421
+ }
192
422
  const repoRoot = repo ?? process.env.REPO_ROOT ?? process.cwd();
193
423
  const repoRootAbs = path.resolve(repoRoot);
194
424
  async function joinExisting() {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ import path from "node:path";
2
+ import express from "express";
3
+ import { renderGistPage, renderGistEditPage, renderGistListPage, renderErrorPage, } from "./views.js";
4
+ const ID_RE = /^[A-Za-z0-9_-]+$/;
5
+ const MD_EXT = new Set([".md", ".markdown", ".mdown", ".mkd", ".mkdn"]);
6
+ /** Resolve the absolute base URL for returned gist links. */
7
+ function resolveBaseUrl(req, baseUrlEnv) {
8
+ if (baseUrlEnv)
9
+ return baseUrlEnv.replace(/\/+$/, "");
10
+ const host = req.get("host");
11
+ if (host)
12
+ return `${req.protocol}://${host}`;
13
+ return "";
14
+ }
15
+ /**
16
+ * Routes for ephemeral gists: `POST /api/gists` (publish, open so remote agents
17
+ * can use it), `GET /gist/:id` (preview), `GET /gist/:id/raw`, and `GET /gists`
18
+ * (the list page).
19
+ */
20
+ export function createGistRouter({ store, md, baseUrlEnv }) {
21
+ const router = express.Router();
22
+ router.post("/api/gists", express.json({ limit: "2mb" }), (req, res) => {
23
+ try {
24
+ const { content, filename, title, ttlSeconds } = req.body ?? {};
25
+ const ttlMs = typeof ttlSeconds === "number" && Number.isFinite(ttlSeconds) && ttlSeconds > 0
26
+ ? ttlSeconds * 1000
27
+ : undefined;
28
+ const gist = store.create({ content, filename, title, ttlMs });
29
+ const base = resolveBaseUrl(req, baseUrlEnv);
30
+ res.status(201).json({
31
+ id: gist.id,
32
+ filename: gist.filename,
33
+ title: gist.title,
34
+ url: `${base}/gist/${gist.id}`,
35
+ rawUrl: `${base}/gist/${gist.id}/raw`,
36
+ createdAt: new Date(gist.createdAt).toISOString(),
37
+ expiresAt: new Date(gist.expiresAt).toISOString(),
38
+ });
39
+ }
40
+ catch (e) {
41
+ const err = e;
42
+ res.status(err.statusCode || 500).json({ error: err.message });
43
+ }
44
+ });
45
+ router.patch("/api/gists/:id", express.json({ limit: "2mb" }), (req, res) => {
46
+ if (!ID_RE.test(req.params.id)) {
47
+ return res.status(400).json({ error: "Invalid gist id" });
48
+ }
49
+ try {
50
+ const { content, filename, title, ttlSeconds } = req.body ?? {};
51
+ const ttlMs = typeof ttlSeconds === "number" && Number.isFinite(ttlSeconds) && ttlSeconds > 0
52
+ ? ttlSeconds * 1000
53
+ : undefined;
54
+ const gist = store.update(req.params.id, { content, filename, title, ttlMs });
55
+ if (!gist)
56
+ return res.status(404).json({ error: "Gist not found or expired" });
57
+ const base = resolveBaseUrl(req, baseUrlEnv);
58
+ res.json({
59
+ id: gist.id,
60
+ filename: gist.filename,
61
+ title: gist.title,
62
+ url: `${base}/gist/${gist.id}`,
63
+ rawUrl: `${base}/gist/${gist.id}/raw`,
64
+ expiresAt: new Date(gist.expiresAt).toISOString(),
65
+ });
66
+ }
67
+ catch (e) {
68
+ const err = e;
69
+ res.status(err.statusCode || 500).json({ error: err.message });
70
+ }
71
+ });
72
+ router.get("/api/gists", (req, res) => {
73
+ const base = resolveBaseUrl(req, baseUrlEnv);
74
+ res.json({
75
+ gists: store.list().map((g) => ({
76
+ id: g.id,
77
+ filename: g.filename,
78
+ title: g.title,
79
+ url: `${base}/gist/${g.id}`,
80
+ rawUrl: `${base}/gist/${g.id}/raw`,
81
+ createdAt: new Date(g.createdAt).toISOString(),
82
+ expiresAt: new Date(g.expiresAt).toISOString(),
83
+ })),
84
+ });
85
+ });
86
+ router.delete("/api/gists/:id", (req, res) => {
87
+ if (!ID_RE.test(req.params.id)) {
88
+ return res.status(400).json({ error: "Invalid gist id" });
89
+ }
90
+ if (!store.delete(req.params.id)) {
91
+ return res.status(404).json({ error: "Gist not found" });
92
+ }
93
+ res.json({ ok: true, id: req.params.id });
94
+ });
95
+ router.get("/gists", (req, res) => {
96
+ res.send(renderGistListPage({ gists: store.list() }));
97
+ });
98
+ router.get("/gist/:id/edit", (req, res) => {
99
+ if (!ID_RE.test(req.params.id)) {
100
+ return res.status(400).send(renderErrorPage({
101
+ title: "Error",
102
+ message: "Invalid gist id",
103
+ repoBase: "",
104
+ repos: [],
105
+ currentRepoId: "",
106
+ }));
107
+ }
108
+ const gist = store.get(req.params.id);
109
+ if (!gist) {
110
+ return res.status(404).send(renderGistListPage({
111
+ gists: store.list(),
112
+ notice: "That gist has expired or does not exist.",
113
+ }));
114
+ }
115
+ res.send(renderGistEditPage({ gist }));
116
+ });
117
+ router.get("/gist/:id/raw", (req, res) => {
118
+ if (!ID_RE.test(req.params.id)) {
119
+ return res.status(400).type("text/plain").send("Invalid gist id");
120
+ }
121
+ const gist = store.get(req.params.id);
122
+ if (!gist) {
123
+ return res.status(404).type("text/plain").send("Gist not found or expired");
124
+ }
125
+ res.type("text/plain; charset=utf-8").send(gist.content);
126
+ });
127
+ router.get("/gist/:id", (req, res) => {
128
+ if (!ID_RE.test(req.params.id)) {
129
+ return res.status(400).send(renderErrorPage({
130
+ title: "Error",
131
+ message: "Invalid gist id",
132
+ repoBase: "",
133
+ repos: [],
134
+ currentRepoId: "",
135
+ }));
136
+ }
137
+ const gist = store.get(req.params.id);
138
+ if (!gist) {
139
+ return res.status(404).send(renderGistListPage({
140
+ gists: store.list(),
141
+ notice: "That gist has expired or does not exist.",
142
+ }));
143
+ }
144
+ const ext = path.posix.extname(gist.filename).toLowerCase();
145
+ const isMarkdown = MD_EXT.has(ext);
146
+ const html = isMarkdown
147
+ ? md.render(gist.content, { baseDirPosix: "", repoBase: "" })
148
+ : md.renderCodeBlock(gist.content, { languageHint: ext ? ext.slice(1) : "" });
149
+ res.send(renderGistPage({ gist, html, isMarkdown }));
150
+ });
151
+ return router;
152
+ }
153
+ //# sourceMappingURL=gist-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gist-router.js","sourceRoot":"","sources":["../src/gist-router.ts"],"names":[],"mappings":"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"}