repoview 0.5.1 → 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.
Files changed (57) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/CONTRIBUTING.md +4 -3
  3. package/DEVELOPMENT.md +84 -16
  4. package/README.md +71 -5
  5. package/dist/api.js +58 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/cli.js +454 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/csv.js +64 -0
  10. package/dist/csv.js.map +1 -0
  11. package/dist/format.js +25 -0
  12. package/dist/format.js.map +1 -0
  13. package/dist/gist-router.js +153 -0
  14. package/dist/gist-router.js.map +1 -0
  15. package/dist/gists.js +130 -0
  16. package/dist/gists.js.map +1 -0
  17. package/dist/git.js +67 -0
  18. package/dist/git.js.map +1 -0
  19. package/dist/gitignore.js +34 -0
  20. package/dist/gitignore.js.map +1 -0
  21. package/dist/linkcheck.js +310 -0
  22. package/dist/linkcheck.js.map +1 -0
  23. package/dist/markdown.js +493 -0
  24. package/dist/markdown.js.map +1 -0
  25. package/dist/net.js +10 -0
  26. package/dist/net.js.map +1 -0
  27. package/dist/paths.js +59 -0
  28. package/dist/paths.js.map +1 -0
  29. package/dist/reload.js +55 -0
  30. package/dist/reload.js.map +1 -0
  31. package/dist/repo-context.js +80 -0
  32. package/dist/repo-context.js.map +1 -0
  33. package/dist/repo-router.js +810 -0
  34. package/dist/repo-router.js.map +1 -0
  35. package/dist/review-cli.js +228 -0
  36. package/dist/review-cli.js.map +1 -0
  37. package/dist/server.js +122 -0
  38. package/dist/server.js.map +1 -0
  39. package/dist/session.js +86 -0
  40. package/dist/session.js.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/views.js +780 -0
  44. package/dist/views.js.map +1 -0
  45. package/package.json +20 -9
  46. package/public/app.css +113 -0
  47. package/public/app.js +26 -3
  48. package/public/gist.js +60 -0
  49. package/public/review.js +9 -6
  50. package/public/session.js +61 -0
  51. package/src/cli.js +0 -91
  52. package/src/gitignore.js +0 -34
  53. package/src/linkcheck.js +0 -312
  54. package/src/markdown.js +0 -518
  55. package/src/review-cli.js +0 -245
  56. package/src/server.js +0 -1126
  57. package/src/views.js +0 -657
@@ -0,0 +1,493 @@
1
+ import path from "node:path";
2
+ import hljs from "highlight.js";
3
+ import GithubSlugger from "github-slugger";
4
+ import MarkdownIt from "markdown-it";
5
+ import { full as emoji } from "markdown-it-emoji";
6
+ import footnote from "markdown-it-footnote";
7
+ import taskLists from "markdown-it-task-lists";
8
+ import sanitizeHtml from "sanitize-html";
9
+ function escapeHtml(s) {
10
+ return String(s)
11
+ .replaceAll("&", "&")
12
+ .replaceAll("<", "&lt;")
13
+ .replaceAll(">", "&gt;")
14
+ .replaceAll('"', "&quot;")
15
+ .replaceAll("'", "&#39;");
16
+ }
17
+ function stripQuotes(s) {
18
+ if (s.length >= 2) {
19
+ const first = s[0];
20
+ const last = s[s.length - 1];
21
+ if ((first === '"' && last === '"') || (first === "'" && last === "'")) {
22
+ return s.slice(1, -1);
23
+ }
24
+ }
25
+ return s;
26
+ }
27
+ function parseFlowList(raw) {
28
+ return raw
29
+ .slice(1, -1)
30
+ .split(",")
31
+ .map((s) => stripQuotes(s.trim()))
32
+ .filter((s) => s.length > 0);
33
+ }
34
+ // Lightweight YAML frontmatter parser. Handles the common forms used in
35
+ // markdown frontmatter: `key: value`, quoted strings, `key: [a, b, c]`,
36
+ // and indented `- item` block lists. Returns null when the leading `---`
37
+ // block doesn't look like YAML, so plain horizontal rules pass through.
38
+ function extractFrontmatter(text) {
39
+ const match = text.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);
40
+ if (!match)
41
+ return { data: null, body: text };
42
+ const block = match[1];
43
+ const lines = block.split(/\r?\n/);
44
+ const data = {};
45
+ const order = [];
46
+ for (let i = 0; i < lines.length; i++) {
47
+ const line = lines[i];
48
+ if (!line.trim() || line.trim().startsWith("#"))
49
+ continue;
50
+ const m = line.match(/^([A-Za-z_][\w-]*)\s*:\s*(.*)$/);
51
+ if (!m) {
52
+ // Anything other than a YAML key on a top-level line means this isn't
53
+ // really frontmatter — bail out and leave the body untouched.
54
+ return { data: null, body: text };
55
+ }
56
+ const key = m[1];
57
+ const raw = m[2].trim();
58
+ if (raw === "") {
59
+ const items = [];
60
+ let j = i + 1;
61
+ while (j < lines.length) {
62
+ const sub = lines[j].match(/^\s+-\s+(.*)$/);
63
+ if (!sub)
64
+ break;
65
+ items.push(stripQuotes(sub[1].trim()));
66
+ j++;
67
+ }
68
+ if (items.length) {
69
+ data[key] = items;
70
+ order.push(key);
71
+ i = j - 1;
72
+ }
73
+ continue;
74
+ }
75
+ if (raw.startsWith("[") && raw.endsWith("]")) {
76
+ data[key] = parseFlowList(raw);
77
+ }
78
+ else {
79
+ data[key] = stripQuotes(raw);
80
+ }
81
+ order.push(key);
82
+ }
83
+ if (order.length === 0)
84
+ return { data: null, body: text };
85
+ // Replace the frontmatter region with blank lines so downstream source-line
86
+ // numbers stay aligned with the original markdown.
87
+ const consumed = match[0];
88
+ const newlineCount = (consumed.match(/\n/g) || []).length;
89
+ const body = "\n".repeat(newlineCount) + text.slice(consumed.length);
90
+ return { data, order, body };
91
+ }
92
+ const FRONTMATTER_KNOWN_KEYS = new Set([
93
+ "title",
94
+ "description",
95
+ "summary",
96
+ "subtitle",
97
+ "date",
98
+ "published",
99
+ "updated",
100
+ "author",
101
+ "authors",
102
+ "tags",
103
+ "categories",
104
+ ]);
105
+ function renderFrontmatter(data, order) {
106
+ const title = data.title;
107
+ const description = data.description ?? data.summary ?? data.subtitle;
108
+ const date = data.date ?? data.published ?? data.updated;
109
+ const authorVal = data.author ?? data.authors;
110
+ const tagsVal = data.tags ?? data.categories;
111
+ const parts = ['<div class="md-frontmatter">'];
112
+ if (title)
113
+ parts.push(`<h1 class="md-frontmatter-title">${escapeHtml(title)}</h1>`);
114
+ if (description)
115
+ parts.push(`<p class="md-frontmatter-description">${escapeHtml(description)}</p>`);
116
+ const meta = [];
117
+ if (date)
118
+ meta.push(`<span class="md-frontmatter-date">${escapeHtml(date)}</span>`);
119
+ if (authorVal) {
120
+ const authors = Array.isArray(authorVal) ? authorVal : [authorVal];
121
+ if (authors.length) {
122
+ meta.push(`<span class="md-frontmatter-author">${authors.map(escapeHtml).join(", ")}</span>`);
123
+ }
124
+ }
125
+ if (tagsVal) {
126
+ const tags = Array.isArray(tagsVal) ? tagsVal : [tagsVal];
127
+ if (tags.length) {
128
+ const items = tags
129
+ .map((t) => `<li class="md-frontmatter-tag">${escapeHtml(t)}</li>`)
130
+ .join("");
131
+ meta.push(`<ul class="md-frontmatter-tags">${items}</ul>`);
132
+ }
133
+ }
134
+ if (meta.length)
135
+ parts.push(`<div class="md-frontmatter-meta">${meta.join("")}</div>`);
136
+ const extras = (order || Object.keys(data)).filter((k) => !FRONTMATTER_KNOWN_KEYS.has(k));
137
+ if (extras.length) {
138
+ const rows = extras
139
+ .map((k) => {
140
+ const v = data[k];
141
+ const display = Array.isArray(v) ? v.join(", ") : v;
142
+ return `<dt>${escapeHtml(k)}</dt><dd>${escapeHtml(display)}</dd>`;
143
+ })
144
+ .join("");
145
+ parts.push(`<dl class="md-frontmatter-extra">${rows}</dl>`);
146
+ }
147
+ parts.push("</div>");
148
+ return parts.join("");
149
+ }
150
+ // CommonMark only allows "1." to interrupt a paragraph, but GitHub allows any number.
151
+ // This preprocessor adds blank lines before ordered lists starting with numbers other than 1.
152
+ function normalizeOrderedLists(text) {
153
+ const lines = text.split("\n");
154
+ const result = [];
155
+ for (let i = 0; i < lines.length; i++) {
156
+ const line = lines[i];
157
+ const prevLine = i > 0 ? lines[i - 1] : "";
158
+ // Check if current line starts an ordered list with number > 1
159
+ if (/^[2-9]\d*\. /.test(line)) {
160
+ // Insert blank line if previous line is non-empty and not a list item
161
+ if (prevLine.trim() && !/^\d+\. /.test(prevLine) && !/^[-*+] /.test(prevLine)) {
162
+ result.push("");
163
+ }
164
+ }
165
+ result.push(line);
166
+ }
167
+ return result.join("\n");
168
+ }
169
+ function isExternalHref(href) {
170
+ return /^(?:[a-z]+:)?\/\//i.test(href) || href.startsWith("mailto:") || href.startsWith("tel:");
171
+ }
172
+ function toPosixPath(p) {
173
+ return p.split(path.sep).join("/");
174
+ }
175
+ function normalizeRepoPath(posixPath) {
176
+ const stripped = String(posixPath || "").replace(/^\/+/, "");
177
+ let normalized = path.posix.normalize(stripped);
178
+ if (normalized === "." || normalized === "./")
179
+ return "";
180
+ // GitHub effectively clamps links so they can't escape the repo root.
181
+ while (normalized === ".." || normalized.startsWith("../")) {
182
+ normalized = normalized === ".." ? "" : normalized.slice(3);
183
+ }
184
+ return normalized;
185
+ }
186
+ function encodePathForUrl(posixPath) {
187
+ return posixPath
188
+ .split("/")
189
+ .map((segment) => encodeURIComponent(segment))
190
+ .join("/");
191
+ }
192
+ function rewriteLinkHref(href, baseDirPosix, repoBase = "") {
193
+ if (!href)
194
+ return href;
195
+ if (href.startsWith("#") || isExternalHref(href))
196
+ return href;
197
+ const trimmed = href.trim();
198
+ const hashIndex = trimmed.indexOf("#");
199
+ const beforeHash = hashIndex >= 0 ? trimmed.slice(0, hashIndex) : trimmed;
200
+ const hash = hashIndex >= 0 ? trimmed.slice(hashIndex + 1) : "";
201
+ const queryIndex = beforeHash.indexOf("?");
202
+ const rawPath = queryIndex >= 0 ? beforeHash.slice(0, queryIndex) : beforeHash;
203
+ const query = queryIndex >= 0 ? beforeHash.slice(queryIndex) : "";
204
+ if (/^\/(?:blob|tree|raw|static)(?:\/|$)/.test(rawPath) || rawPath === "/events") {
205
+ return href;
206
+ }
207
+ // Already prefixed for this repo (e.g. a second rewrite pass during sanitize).
208
+ if (repoBase && rawPath.startsWith(`${repoBase}/`))
209
+ return href;
210
+ const raw = rawPath.trim();
211
+ if (!raw)
212
+ return href;
213
+ const isRooted = raw.startsWith("/");
214
+ const targetPosix = isRooted
215
+ ? normalizeRepoPath(raw)
216
+ : normalizeRepoPath(path.posix.join(baseDirPosix || "", raw));
217
+ if (targetPosix == null)
218
+ return href;
219
+ const isTree = raw.endsWith("/") || targetPosix === "";
220
+ const newPath = `${repoBase}/${isTree ? "tree" : "blob"}/${encodePathForUrl(targetPosix)}`;
221
+ const withQuery = query ? `${newPath}${query}` : newPath;
222
+ return hash ? `${withQuery}#${hash}` : withQuery;
223
+ }
224
+ function rewriteImageSrc(src, baseDirPosix, repoBase = "") {
225
+ if (!src)
226
+ return src;
227
+ if (isExternalHref(src) || src.startsWith("data:"))
228
+ return src;
229
+ const trimmed = src.trim();
230
+ const hashIndex = trimmed.indexOf("#");
231
+ const beforeHash = hashIndex >= 0 ? trimmed.slice(0, hashIndex) : trimmed;
232
+ const hash = hashIndex >= 0 ? trimmed.slice(hashIndex + 1) : "";
233
+ const queryIndex = beforeHash.indexOf("?");
234
+ const rawPath = queryIndex >= 0 ? beforeHash.slice(0, queryIndex) : beforeHash;
235
+ const query = queryIndex >= 0 ? beforeHash.slice(queryIndex) : "";
236
+ if (/^\/(?:raw|static)(?:\/|$)/.test(rawPath))
237
+ return src;
238
+ // Already prefixed for this repo (e.g. a second rewrite pass during sanitize).
239
+ if (repoBase && rawPath.startsWith(`${repoBase}/`))
240
+ return src;
241
+ const isRooted = rawPath.startsWith("/");
242
+ const targetPosix = isRooted
243
+ ? normalizeRepoPath(rawPath)
244
+ : normalizeRepoPath(path.posix.join(baseDirPosix || "", rawPath));
245
+ if (targetPosix == null)
246
+ return src;
247
+ const newPath = `${repoBase}/raw/${encodePathForUrl(targetPosix)}`;
248
+ const withQuery = query ? `${newPath}${query}` : newPath;
249
+ return hash ? `${withQuery}#${hash}` : withQuery;
250
+ }
251
+ export function createMarkdownRenderer() {
252
+ const md = new MarkdownIt({
253
+ html: true,
254
+ linkify: true,
255
+ typographer: false,
256
+ highlight(code, lang) {
257
+ if (lang && hljs.getLanguage(lang)) {
258
+ return hljs.highlight(code, { language: lang }).value;
259
+ }
260
+ return hljs.highlightAuto(code).value;
261
+ },
262
+ })
263
+ .use(emoji, { shortcuts: {} })
264
+ .use(footnote)
265
+ .use(taskLists, { enabled: true, label: false, labelAfter: false })
266
+ .enable(["table", "strikethrough"]);
267
+ const defaultFence = md.renderer.rules.fence;
268
+ md.renderer.rules.fence = function (tokens, idx, options, env, self) {
269
+ const token = tokens[idx];
270
+ const info = (token.info || "").trim();
271
+ const lang = info.split(/\s+/g)[0]?.toLowerCase() || "";
272
+ if (lang === "mermaid") {
273
+ return `<pre class="mermaid">${escapeHtml(token.content || "")}</pre>\n`;
274
+ }
275
+ if (typeof defaultFence === "function")
276
+ return defaultFence(tokens, idx, options, env, self);
277
+ return self.renderToken(tokens, idx, options);
278
+ };
279
+ const fallbackRule = (tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options);
280
+ const defaultLinkOpen = md.renderer.rules.link_open || fallbackRule;
281
+ md.renderer.rules.link_open = function (tokens, idx, options, env, self) {
282
+ const token = tokens[idx];
283
+ const hrefIndex = token.attrIndex("href");
284
+ if (hrefIndex >= 0) {
285
+ const href = token.attrs[hrefIndex][1];
286
+ const rewritten = rewriteLinkHref(href, env.baseDirPosix || "", env.repoBase || "");
287
+ token.attrs[hrefIndex][1] = rewritten;
288
+ if (isExternalHref(href)) {
289
+ token.attrSet("target", "_blank");
290
+ token.attrSet("rel", "noreferrer noopener");
291
+ }
292
+ }
293
+ return defaultLinkOpen(tokens, idx, options, env, self);
294
+ };
295
+ const defaultImage = md.renderer.rules.image || fallbackRule;
296
+ md.renderer.rules.image = function (tokens, idx, options, env, self) {
297
+ const token = tokens[idx];
298
+ const srcIndex = token.attrIndex("src");
299
+ if (srcIndex >= 0) {
300
+ const src = token.attrs[srcIndex][1];
301
+ token.attrs[srcIndex][1] = rewriteImageSrc(src, env.baseDirPosix || "", env.repoBase || "");
302
+ }
303
+ return defaultImage(tokens, idx, options, env, self);
304
+ };
305
+ const defaultHeadingOpen = md.renderer.rules.heading_open || fallbackRule;
306
+ md.renderer.rules.heading_open = function (tokens, idx, options, env, self) {
307
+ const token = tokens[idx];
308
+ if (token.attrIndex("id") < 0 && token.tag && token.tag.startsWith("h")) {
309
+ const titleToken = tokens[idx + 1];
310
+ const headingText = titleToken?.content || "";
311
+ const slugger = env.__slugger || (env.__slugger = new GithubSlugger());
312
+ const slug = slugger.slug(headingText);
313
+ if (slug)
314
+ token.attrSet("id", slug);
315
+ }
316
+ const idIndex = token.attrIndex("id");
317
+ const id = idIndex >= 0 ? token.attrs[idIndex][1] : "";
318
+ const rendered = defaultHeadingOpen(tokens, idx, options, env, self);
319
+ if (!id)
320
+ return rendered;
321
+ return `${rendered}<a class="anchor" aria-hidden="true" href="#${escapeHtml(id)}"></a>`;
322
+ };
323
+ const alertTypes = new Map([
324
+ ["NOTE", { classSuffix: "note", title: "Note" }],
325
+ ["TIP", { classSuffix: "tip", title: "Tip" }],
326
+ ["IMPORTANT", { classSuffix: "important", title: "Important" }],
327
+ ["WARNING", { classSuffix: "warning", title: "Warning" }],
328
+ ["CAUTION", { classSuffix: "caution", title: "Caution" }],
329
+ ]);
330
+ md.core.ruler.after("inline", "github-alerts", (state) => {
331
+ const tokens = state.tokens;
332
+ for (let i = 0; i < tokens.length; i++) {
333
+ if (tokens[i].type !== "blockquote_open")
334
+ continue;
335
+ let level = 1;
336
+ let closeIndex = -1;
337
+ for (let j = i + 1; j < tokens.length; j++) {
338
+ if (tokens[j].type === "blockquote_open")
339
+ level++;
340
+ else if (tokens[j].type === "blockquote_close")
341
+ level--;
342
+ if (level === 0) {
343
+ closeIndex = j;
344
+ break;
345
+ }
346
+ }
347
+ if (closeIndex === -1)
348
+ continue;
349
+ const paragraphOpen = tokens[i + 1];
350
+ const inline = tokens[i + 2];
351
+ if (paragraphOpen?.type !== "paragraph_open" || inline?.type !== "inline")
352
+ continue;
353
+ const children = inline.children || [];
354
+ const firstTextIndex = children.findIndex((t) => t.type === "text" && /^\s*\[!\w+\]/.test(t.content));
355
+ if (firstTextIndex === -1)
356
+ continue;
357
+ const match = children[firstTextIndex].content.match(/^\s*\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*/i);
358
+ if (!match)
359
+ continue;
360
+ const typeKey = match[1].toUpperCase();
361
+ const alert = alertTypes.get(typeKey);
362
+ if (!alert)
363
+ continue;
364
+ children[firstTextIndex].content = children[firstTextIndex].content.slice(match[0].length);
365
+ if (children[firstTextIndex].content.length === 0) {
366
+ children.splice(firstTextIndex, 1);
367
+ if (children[firstTextIndex]?.type === "softbreak")
368
+ children.splice(firstTextIndex, 1);
369
+ }
370
+ while (children[0]?.type === "softbreak")
371
+ children.shift();
372
+ const open = tokens[i];
373
+ open.type = "html_block";
374
+ open.tag = "";
375
+ open.nesting = 0;
376
+ open.markup = "";
377
+ open.content = `<div class="markdown-alert markdown-alert-${alert.classSuffix}">\n`;
378
+ open.block = true;
379
+ const close = tokens[closeIndex];
380
+ close.type = "html_block";
381
+ close.tag = "";
382
+ close.nesting = 0;
383
+ close.markup = "";
384
+ close.content = `</div>\n`;
385
+ close.block = true;
386
+ const titleToken = new state.Token("html_block", "", 0);
387
+ titleToken.content = `<p class="markdown-alert-title">${escapeHtml(alert.title)}</p>\n`;
388
+ titleToken.block = true;
389
+ tokens.splice(i + 1, 0, titleToken);
390
+ i++;
391
+ }
392
+ });
393
+ // Source line mapping for inline comment anchoring (opt-in via env.emitLineMap)
394
+ md.core.ruler.push("source-line-map", (state) => {
395
+ if (!state.env.emitLineMap)
396
+ return;
397
+ for (const token of state.tokens) {
398
+ if (token.nesting !== 1)
399
+ continue; // only opening tokens
400
+ if (token.map && token.map.length === 2) {
401
+ token.attrSet("data-source-line-start", String(token.map[0] + 1));
402
+ token.attrSet("data-source-line-end", String(token.map[1]));
403
+ }
404
+ }
405
+ });
406
+ function sanitize(html, env) {
407
+ const baseDirPosix = env?.baseDirPosix || "";
408
+ const repoBase = env?.repoBase || "";
409
+ return sanitizeHtml(html, {
410
+ allowedTags: [
411
+ ...sanitizeHtml.defaults.allowedTags,
412
+ "details",
413
+ "summary",
414
+ "img",
415
+ "section",
416
+ "sup",
417
+ "h1",
418
+ "h2",
419
+ "h3",
420
+ "h4",
421
+ "h5",
422
+ "h6",
423
+ "table",
424
+ "thead",
425
+ "tbody",
426
+ "tr",
427
+ "th",
428
+ "td",
429
+ "pre",
430
+ "code",
431
+ "span",
432
+ "div",
433
+ "kbd",
434
+ "input",
435
+ ],
436
+ allowedAttributes: {
437
+ "*": ["class", "id", "aria-label", "aria-hidden", "role", "align", "data-source-line-start", "data-source-line-end"],
438
+ a: ["href", "name", "title", "target", "rel", "tabindex"],
439
+ img: ["src", "alt", "title", "width", "height", "loading"],
440
+ input: ["type", "checked", "disabled"],
441
+ details: ["open"],
442
+ },
443
+ allowedSchemes: ["http", "https", "mailto", "tel", "data"],
444
+ allowProtocolRelative: true,
445
+ transformTags: {
446
+ a: (tagName, attribs) => {
447
+ const next = { ...attribs };
448
+ if (next.href) {
449
+ const originalHref = next.href;
450
+ next.href = rewriteLinkHref(originalHref, baseDirPosix, repoBase);
451
+ if (isExternalHref(originalHref)) {
452
+ next.target = "_blank";
453
+ next.rel = "noreferrer noopener";
454
+ }
455
+ }
456
+ return { tagName, attribs: next };
457
+ },
458
+ img: (tagName, attribs) => {
459
+ const next = { ...attribs };
460
+ if (next.src)
461
+ next.src = rewriteImageSrc(next.src, baseDirPosix, repoBase);
462
+ if (!next.loading)
463
+ next.loading = "lazy";
464
+ return { tagName, attribs: next };
465
+ },
466
+ input: (tagName, attribs) => {
467
+ const next = { ...attribs };
468
+ if (next.type === "checkbox")
469
+ next.disabled = "disabled";
470
+ return { tagName, attribs: next };
471
+ },
472
+ },
473
+ });
474
+ }
475
+ return {
476
+ render(markdown, env) {
477
+ const e = env ?? {};
478
+ const source = markdown ?? "";
479
+ const fm = extractFrontmatter(source);
480
+ const fmHtml = fm.data ? renderFrontmatter(fm.data, fm.order) : "";
481
+ const html = md.render(fm.body, e);
482
+ return sanitize(fmHtml + html, e);
483
+ },
484
+ renderCodeBlock(text, { languageHint } = {}) {
485
+ const lang = languageHint && hljs.getLanguage(languageHint) ? languageHint : "";
486
+ const highlighted = lang
487
+ ? hljs.highlight(text, { language: lang }).value
488
+ : hljs.highlightAuto(text).value;
489
+ return sanitize(`<pre class="hljs"><code>${highlighted || escapeHtml(text)}</code></pre>`, { baseDirPosix: "" });
490
+ },
491
+ };
492
+ }
493
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
package/dist/net.js ADDED
@@ -0,0 +1,10 @@
1
+ /** Loopback remote addresses (IPv4, IPv6, and IPv4-mapped IPv6). */
2
+ const LOOPBACK = new Set(["127.0.0.1", "::1", "::ffff:127.0.0.1"]);
3
+ export function isLoopbackAddress(addr) {
4
+ return !!addr && LOOPBACK.has(addr);
5
+ }
6
+ /** Whether a host bind address is loopback-only (not reachable from the network). */
7
+ export function isLoopbackHost(host) {
8
+ return host === "127.0.0.1" || host === "::1" || host === "localhost";
9
+ }
10
+ //# sourceMappingURL=net.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"net.js","sourceRoot":"","sources":["../src/net.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAEnE,MAAM,UAAU,iBAAiB,CAAC,IAA+B;IAC/D,OAAO,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,WAAW,CAAC;AACxE,CAAC"}
package/dist/paths.js ADDED
@@ -0,0 +1,59 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ export function toPosixPath(p) {
4
+ return p.split(path.sep).join("/");
5
+ }
6
+ export function encodePathForUrl(posixPath) {
7
+ return posixPath
8
+ .split("/")
9
+ .map((segment) => encodeURIComponent(segment))
10
+ .join("/");
11
+ }
12
+ export function isWithinRoot(rootReal, candidateReal) {
13
+ if (candidateReal === rootReal)
14
+ return true;
15
+ const rootWithSep = rootReal.endsWith(path.sep) ? rootReal : rootReal + path.sep;
16
+ return candidateReal.startsWith(rootWithSep);
17
+ }
18
+ export async function safeRealpath(rootReal, requestPath) {
19
+ const stripped = String(requestPath || "").replace(/^\/+/, "");
20
+ const resolved = path.resolve(rootReal, stripped);
21
+ if (!isWithinRoot(rootReal, resolved)) {
22
+ const err = new Error("Path escapes repo root");
23
+ err.statusCode = 400;
24
+ throw err;
25
+ }
26
+ let real;
27
+ try {
28
+ real = await fs.realpath(resolved);
29
+ }
30
+ catch (e) {
31
+ e.statusCode = 404;
32
+ throw e;
33
+ }
34
+ if (!isWithinRoot(rootReal, real)) {
35
+ const err = new Error("Path resolves outside repo root");
36
+ err.statusCode = 400;
37
+ throw err;
38
+ }
39
+ return { stripped, resolved: real };
40
+ }
41
+ export async function statSafe(p, { followSymlinks = true } = {}) {
42
+ try {
43
+ const stat = followSymlinks ? await fs.stat(p) : await fs.lstat(p);
44
+ return {
45
+ isFile: stat.isFile(),
46
+ isDir: stat.isDirectory(),
47
+ size: stat.size,
48
+ mtimeMs: stat.mtimeMs,
49
+ };
50
+ }
51
+ catch (e) {
52
+ const code = e.code;
53
+ if (code === "EACCES" || code === "EPERM") {
54
+ return null;
55
+ }
56
+ throw e;
57
+ }
58
+ }
59
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAc7B,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,SAAS;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;SAC7C,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,aAAqB;IAClE,IAAI,aAAa,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;IACjF,OAAO,aAAa,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAc,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3D,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QACrB,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACV,CAAe,CAAC,UAAU,GAAG,GAAG,CAAC;QAClC,MAAM,CAAC,CAAC;IACV,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,GAAc,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACpE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QACrB,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,CAAS,EACT,EAAE,cAAc,GAAG,IAAI,KAAmC,EAAE;IAE5D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,GAAI,CAA2B,CAAC,IAAI,CAAC;QAC/C,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}