sourcey 3.6.0 → 3.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 (82) hide show
  1. package/README.md +5 -2
  2. package/dist/adapters/index.d.ts +3 -2
  3. package/dist/adapters/index.d.ts.map +1 -1
  4. package/dist/adapters/index.js +35 -3
  5. package/dist/adapters/types.d.ts +8 -2
  6. package/dist/adapters/types.d.ts.map +1 -1
  7. package/dist/cli.js +28 -34
  8. package/dist/client/search.js +181 -119
  9. package/dist/client/tabs.js +23 -0
  10. package/dist/components/layout/Head.js +2 -2
  11. package/dist/components/openapi/Introduction.d.ts.map +1 -1
  12. package/dist/components/openapi/Introduction.js +16 -1
  13. package/dist/components/openapi/Security.d.ts.map +1 -1
  14. package/dist/components/openapi/Security.js +18 -2
  15. package/dist/config.d.ts +63 -0
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +21 -7
  18. package/dist/core/api-rendering.d.ts +47 -0
  19. package/dist/core/api-rendering.d.ts.map +1 -0
  20. package/dist/core/api-rendering.js +76 -0
  21. package/dist/core/doxygen-loader.d.ts.map +1 -1
  22. package/dist/core/doxygen-loader.js +35 -18
  23. package/dist/core/godoc-loader.d.ts.map +1 -1
  24. package/dist/core/godoc-loader.js +17 -6
  25. package/dist/core/markdown-loader.d.ts.map +1 -1
  26. package/dist/core/markdown-loader.js +8 -5
  27. package/dist/core/mcp-normalizer.d.ts.map +1 -1
  28. package/dist/core/mcp-normalizer.js +48 -34
  29. package/dist/core/parser.d.ts.map +1 -1
  30. package/dist/core/parser.js +75 -4
  31. package/dist/core/rustdoc-introspector.d.ts +29 -0
  32. package/dist/core/rustdoc-introspector.d.ts.map +1 -0
  33. package/dist/core/rustdoc-introspector.js +236 -0
  34. package/dist/core/rustdoc-loader.d.ts +25 -0
  35. package/dist/core/rustdoc-loader.d.ts.map +1 -0
  36. package/dist/core/rustdoc-loader.js +469 -0
  37. package/dist/core/rustdoc-render.d.ts +76 -0
  38. package/dist/core/rustdoc-render.d.ts.map +1 -0
  39. package/dist/core/rustdoc-render.js +785 -0
  40. package/dist/core/rustdoc-types.d.ts +314 -0
  41. package/dist/core/rustdoc-types.d.ts.map +1 -0
  42. package/dist/core/rustdoc-types.js +18 -0
  43. package/dist/core/search-indexer.js +1 -1
  44. package/dist/core/sourcey-rustdoc/Cargo.lock +705 -0
  45. package/dist/core/sourcey-rustdoc/Cargo.toml +38 -0
  46. package/dist/core/sourcey-rustdoc/README.md +59 -0
  47. package/dist/core/sourcey-rustdoc/src/diagnostics.rs +42 -0
  48. package/dist/core/sourcey-rustdoc/src/doctest.rs +268 -0
  49. package/dist/core/sourcey-rustdoc/src/extract.rs +492 -0
  50. package/dist/core/sourcey-rustdoc/src/lib.rs +58 -0
  51. package/dist/core/sourcey-rustdoc/src/links.rs +126 -0
  52. package/dist/core/sourcey-rustdoc/src/main.rs +256 -0
  53. package/dist/core/sourcey-rustdoc/src/signature.rs +415 -0
  54. package/dist/core/sourcey-rustdoc/src/spec.rs +390 -0
  55. package/dist/core/sourcey-rustdoc/tests/format_version.rs +45 -0
  56. package/dist/dev-server.d.ts.map +1 -1
  57. package/dist/dev-server.js +49 -0
  58. package/dist/index.d.ts +4 -2
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +22 -13
  61. package/dist/init.js +2 -2
  62. package/dist/renderer/changelog-feed.d.ts.map +1 -1
  63. package/dist/renderer/changelog-feed.js +27 -19
  64. package/dist/renderer/html-builder.d.ts.map +1 -1
  65. package/dist/renderer/html-builder.js +4 -3
  66. package/dist/renderer/llms.js +57 -2
  67. package/dist/site-assembly.d.ts +5 -0
  68. package/dist/site-assembly.d.ts.map +1 -1
  69. package/dist/site-assembly.js +55 -1
  70. package/dist/themes/default/sourcey.css +300 -0
  71. package/dist/utils/code-samples.d.ts +1 -0
  72. package/dist/utils/code-samples.d.ts.map +1 -1
  73. package/dist/utils/code-samples.js +30 -22
  74. package/dist/utils/html.d.ts +10 -0
  75. package/dist/utils/html.d.ts.map +1 -0
  76. package/dist/utils/html.js +152 -0
  77. package/dist/utils/http.d.ts +0 -2
  78. package/dist/utils/http.d.ts.map +1 -1
  79. package/dist/utils/http.js +19 -34
  80. package/dist/utils/markdown.d.ts.map +1 -1
  81. package/dist/utils/markdown.js +102 -37
  82. package/package.json +9 -4
package/dist/config.d.ts CHANGED
@@ -136,6 +136,63 @@ export interface GodocGoEnv {
136
136
  GOARCH?: string;
137
137
  tags?: string[];
138
138
  }
139
+ export type RustdocMode = "auto" | "live" | "snapshot";
140
+ export interface RustdocFeatures {
141
+ /** Use the crate's default features. Defaults to `true`. */
142
+ default?: boolean;
143
+ /** Extra features to enable. */
144
+ list?: string[];
145
+ /** Enable every feature. Overrides `default` and `list`. */
146
+ all?: boolean;
147
+ }
148
+ export interface RustdocConfig {
149
+ /** Cargo manifest path. Either a Cargo.toml or a directory that contains one. */
150
+ manifest?: string;
151
+ /** Crates to document. Defaults to the manifest's own package. */
152
+ crates?: string[];
153
+ /** Optional path to a committed v1 RustdocSpec snapshot (rustdoc.json). */
154
+ snapshot?: string;
155
+ /**
156
+ * Source mode.
157
+ * - "live": invoke the bundled Rust helper at build time (requires nightly).
158
+ * - "snapshot": read the committed snapshot file; no Rust toolchain required.
159
+ * - "auto" (default): prefer live when nightly is available; fall back to snapshot.
160
+ */
161
+ mode?: RustdocMode;
162
+ /** Feature selection. Defaults to `{ default: true }`. */
163
+ features?: RustdocFeatures;
164
+ /** Include `pub(crate)` and private items (default: false). */
165
+ includePrivate?: boolean;
166
+ /** Include items marked `#[doc(hidden)]` (default: false). */
167
+ includeHidden?: boolean;
168
+ /** Target triple to build docs for. */
169
+ target?: string;
170
+ /** rustup toolchain name. Defaults to `nightly`. */
171
+ toolchain?: string;
172
+ /**
173
+ * Repository-relative base path for source links. Leave empty when the
174
+ * configured manifest is at the repository root.
175
+ */
176
+ sourceBasePath?: string;
177
+ /** Render a dedicated doctests index page. Defaults to `true`. */
178
+ doctestsIndex?: boolean;
179
+ }
180
+ export interface ResolvedRustdocConfig {
181
+ /** Absolute path to the Cargo manifest file. */
182
+ manifest: string;
183
+ /** Crates to document. Always at least one entry. */
184
+ crates: string[];
185
+ /** Absolute path to a snapshot file when configured. */
186
+ snapshot?: string;
187
+ mode: RustdocMode;
188
+ features: Required<RustdocFeatures>;
189
+ includePrivate: boolean;
190
+ includeHidden: boolean;
191
+ target?: string;
192
+ toolchain: string;
193
+ sourceBasePath: string;
194
+ doctestsIndex: boolean;
195
+ }
139
196
  export interface GodocConfig {
140
197
  /** Module root (directory containing go.mod). Defaults to the directory containing sourcey.config.ts. */
141
198
  module?: string;
@@ -187,6 +244,11 @@ export interface TabConfig {
187
244
  * `{ module: <value>, packages: ["./..."], mode: "auto", includeTests: true }`.
188
245
  */
189
246
  godoc?: GodocConfig | string;
247
+ /**
248
+ * Native Rust API documentation. String shorthand expands to
249
+ * `{ manifest: <value>, mode: "auto", doctestsIndex: true }`.
250
+ */
251
+ rustdoc?: RustdocConfig | string;
190
252
  }
191
253
  export interface GroupConfig {
192
254
  group: string;
@@ -293,6 +355,7 @@ export interface ResolvedTab {
293
355
  doxygen?: ResolvedDoxygenConfig;
294
356
  mcp?: string;
295
357
  godoc?: ResolvedGodocConfig;
358
+ rustdoc?: ResolvedRustdocConfig;
296
359
  }
297
360
  export interface ResolvedPage {
298
361
  /** Original config slug (e.g. "run/index") */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -2,7 +2,8 @@ import { access } from "node:fs/promises";
2
2
  import { resolve, dirname } from "node:path";
3
3
  import { createJiti } from "jiti";
4
4
  import { normalizeBaseUrl, normalizeSiteUrl } from "./site-url.js";
5
- import { doxygen as doxygenSource, godoc as godocSource, markdown as markdownSource, mcp as mcpSource, mkdocs as mkdocsSource, openapi as openapiSource, } from "./adapters/index.js";
5
+ import { doxygen as doxygenSource, godoc as godocSource, markdown as markdownSource, mcp as mcpSource, mkdocs as mkdocsSource, openapi as openapiSource, rustdoc as rustdocSource, } from "./adapters/index.js";
6
+ import { DEFAULT_CODE_SAMPLE_LANGS, SUPPORTED_CODE_SAMPLE_LANGS } from "./utils/code-samples.js";
6
7
  export function defineConfig(config) {
7
8
  return config;
8
9
  }
@@ -108,7 +109,7 @@ export async function resolveConfigFromRaw(raw, configDir) {
108
109
  repo: raw.repo,
109
110
  editBranch: raw.editBranch,
110
111
  editBasePath: raw.editBasePath,
111
- codeSamples: raw.codeSamples ?? ["curl", "javascript", "python"],
112
+ codeSamples: resolveCodeSamples(raw.codeSamples),
112
113
  tabs,
113
114
  navbar: {
114
115
  links: raw.navbar?.links ?? [],
@@ -188,16 +189,17 @@ async function resolveTabs(tabs, configDir) {
188
189
  tab.source,
189
190
  tab.openapi,
190
191
  tab.mkdocs,
191
- tab.groups,
192
+ tab.groups?.length ? tab.groups : undefined,
192
193
  tab.doxygen,
193
194
  tab.mcp,
194
195
  tab.godoc,
196
+ tab.rustdoc,
195
197
  ].filter(Boolean).length;
196
198
  if (sources > 1) {
197
- throw new Error(`Tab "${tab.tab}" has multiple sources; use only one of "source", "openapi", "mkdocs", "groups", "doxygen", "mcp", or "godoc"`);
199
+ throw new Error(`Tab "${tab.tab}" has multiple sources; use only one of "source", "openapi", "mkdocs", "groups", "doxygen", "mcp", "godoc", or "rustdoc"`);
198
200
  }
199
201
  if (sources === 0) {
200
- throw new Error(`Tab "${tab.tab}" needs one of "source", "openapi", "mkdocs", "groups", "doxygen", "mcp", or "godoc"`);
202
+ throw new Error(`Tab "${tab.tab}" needs one of "source", "openapi", "mkdocs", "groups", "doxygen", "mcp", "godoc", or "rustdoc"`);
201
203
  }
202
204
  const adapter = tab.source ?? legacySourceAdapter(tab);
203
205
  const source = await adapter.resolve({
@@ -223,6 +225,8 @@ function legacySourceAdapter(tab) {
223
225
  return doxygenSource(tab.doxygen);
224
226
  if (tab.godoc)
225
227
  return godocSource(tab.godoc);
228
+ if (tab.rustdoc)
229
+ return rustdocSource(tab.rustdoc);
226
230
  return markdownSource({ groups: tab.groups });
227
231
  }
228
232
  function resolvedTabFromSource(label, slug, source) {
@@ -242,6 +246,8 @@ function resolvedTabFromSource(label, slug, source) {
242
246
  return { ...base, doxygen: source.config };
243
247
  case "godoc":
244
248
  return { ...base, godoc: source.config };
249
+ case "rustdoc":
250
+ return { ...base, rustdoc: source.config };
245
251
  }
246
252
  }
247
253
  // ---------------------------------------------------------------------------
@@ -291,14 +297,22 @@ function resolvePrettyUrls(value) {
291
297
  throw new Error(`Invalid prettyUrls "${String(value)}". Expected false, "slash", or "strip".`);
292
298
  }
293
299
  export function hexToRgb(hex) {
294
- const h = hex.replace("#", "");
295
- if (h.length !== 6)
300
+ const h = hex.replace(/^#/, "");
301
+ if (!/^[0-9a-fA-F]{6}$/.test(h))
296
302
  throw new Error(`Invalid hex color: "${hex}"`);
297
303
  const r = parseInt(h.slice(0, 2), 16);
298
304
  const g = parseInt(h.slice(2, 4), 16);
299
305
  const b = parseInt(h.slice(4, 6), 16);
300
306
  return `${r} ${g} ${b}`;
301
307
  }
308
+ function resolveCodeSamples(value) {
309
+ const langs = value ?? DEFAULT_CODE_SAMPLE_LANGS;
310
+ const unsupported = langs.filter((lang) => !SUPPORTED_CODE_SAMPLE_LANGS.includes(lang));
311
+ if (unsupported.length) {
312
+ throw new Error(`Invalid codeSamples value "${unsupported[0]}". Must be one of: ${SUPPORTED_CODE_SAMPLE_LANGS.join(", ")}`);
313
+ }
314
+ return [...langs];
315
+ }
302
316
  async function assertExists(filePath, label) {
303
317
  try {
304
318
  await access(filePath);
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Shared API-documentation rendering primitives.
3
+ *
4
+ * Introduced by the rustdoc adapter and designed to be reusable by the godoc
5
+ * and doxygen adapters in a follow-on retrofit. Class names mirror rustdoc's
6
+ * DOM so deep-links from a rustdoc URL line up with sourcey output.
7
+ */
8
+ export interface ApiStabilityCalloutInput {
9
+ kind: "unstable" | "deprecated" | "portability" | "non_exhaustive" | "must_use";
10
+ since?: string | null;
11
+ reason?: string | null;
12
+ featureName?: string | null;
13
+ issueId?: number | null;
14
+ /** Tracking-issue URL prefix; defaults to rust-lang issues. */
15
+ issueBaseUrl?: string;
16
+ }
17
+ export declare function apiStabilityCallout(input: ApiStabilityCalloutInput): string;
18
+ export interface ApiItemInfoRowInput {
19
+ since?: string | null;
20
+ sourceHref?: string | null;
21
+ sourceLabel?: string;
22
+ }
23
+ export declare function apiItemInfoRow(input: ApiItemInfoRowInput): string;
24
+ export interface ApiSymbolLinkInput {
25
+ kind: string;
26
+ href: string;
27
+ text: string;
28
+ title?: string;
29
+ }
30
+ export declare function apiSymbolLink(input: ApiSymbolLinkInput): string;
31
+ export interface ApiToggleInput {
32
+ open?: boolean;
33
+ summary: string;
34
+ body: string;
35
+ cssClass: string;
36
+ }
37
+ export declare function apiImplToggle(input: Omit<ApiToggleInput, "cssClass">): string;
38
+ export interface ApiSectionAnchorInput {
39
+ level: 2 | 3 | 4 | 5;
40
+ id: string;
41
+ text: string;
42
+ className?: string;
43
+ }
44
+ export declare function apiSectionAnchor(input: ApiSectionAnchorInput): string;
45
+ export declare function escapeHtml(value: string): string;
46
+ export declare function escapeAttr(value: string): string;
47
+ //# sourceMappingURL=api-rendering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-rendering.d.ts","sourceRoot":"","sources":["../../src/core/api-rendering.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,gBAAgB,GAAG,UAAU,CAAC;IAChF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CA8B3E;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAcjE;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAK/D;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG,MAAM,CAK7E;AASD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAQrE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Shared API-documentation rendering primitives.
3
+ *
4
+ * Introduced by the rustdoc adapter and designed to be reusable by the godoc
5
+ * and doxygen adapters in a follow-on retrofit. Class names mirror rustdoc's
6
+ * DOM so deep-links from a rustdoc URL line up with sourcey output.
7
+ */
8
+ import { escapeAttr as sharedEscapeAttr, escapeHtml as sharedEscapeHtml } from "../utils/html.js";
9
+ export function apiStabilityCallout(input) {
10
+ switch (input.kind) {
11
+ case "unstable": {
12
+ const issue = input.issueId
13
+ ? ` (<a href="${escapeAttr((input.issueBaseUrl ?? "https://github.com/rust-lang/rust/issues/") +
14
+ String(input.issueId))}">#${input.issueId}</a>)`
15
+ : "";
16
+ const feature = input.featureName ? ` <code>${escapeHtml(input.featureName)}</code>` : "";
17
+ return `<div class="stab unstable api-stab api-stab-unstable">🔬 This is a nightly-only experimental API.${feature}${issue}</div>`;
18
+ }
19
+ case "deprecated": {
20
+ const since = input.since ? ` since ${escapeHtml(input.since)}` : "";
21
+ const reason = input.reason ? `: ${escapeHtml(input.reason)}` : "";
22
+ return `<div class="stab deprecated api-stab api-stab-deprecated">👎 Deprecated${since}${reason}</div>`;
23
+ }
24
+ case "portability": {
25
+ const feature = input.featureName
26
+ ? ` crate feature <code>${escapeHtml(input.featureName)}</code>`
27
+ : "";
28
+ return `<div class="stab portability api-stab api-stab-portability">Available on${feature} only.</div>`;
29
+ }
30
+ case "non_exhaustive":
31
+ return `<div class="stab api-stab api-stab-non-exhaustive">This is marked <code>#[non_exhaustive]</code>; new variants or fields may be added in future versions.</div>`;
32
+ case "must_use": {
33
+ const reason = input.reason ? `: ${escapeHtml(input.reason)}` : "";
34
+ return `<div class="stab api-stab api-stab-must-use"><code>#[must_use]</code>${reason}</div>`;
35
+ }
36
+ }
37
+ }
38
+ export function apiItemInfoRow(input) {
39
+ const parts = [];
40
+ if (input.since) {
41
+ parts.push(`<span class="since api-since">${escapeHtml(input.since)}</span>`);
42
+ }
43
+ if (input.sourceHref) {
44
+ parts.push(`<a class="srclink api-srclink" href="${escapeAttr(input.sourceHref)}">${escapeHtml(input.sourceLabel ?? "Source")}</a>`);
45
+ }
46
+ if (parts.length === 0)
47
+ return "";
48
+ return `<div class="rightside api-rightside">${parts.join(" · ")}</div>`;
49
+ }
50
+ export function apiSymbolLink(input) {
51
+ const title = input.title ? ` title="${escapeAttr(input.title)}"` : "";
52
+ return `<a class="${escapeAttr(input.kind)} api-symbol-link"${title} href="${escapeAttr(input.href)}">${escapeHtml(input.text)}</a>`;
53
+ }
54
+ export function apiImplToggle(input) {
55
+ return apiToggle({
56
+ ...input,
57
+ cssClass: "api-toggle api-impl-toggle",
58
+ });
59
+ }
60
+ function apiToggle(input) {
61
+ const openAttr = input.open === false ? "" : " open";
62
+ return `<details class="${escapeAttr(input.cssClass)}"${openAttr}><summary class="api-toggle-summary">${input.summary}</summary><div class="api-toggle-body">${input.body}</div></details>`;
63
+ }
64
+ export function apiSectionAnchor(input) {
65
+ const cls = input.className ? ` ${input.className}` : "";
66
+ return (`<h${input.level} id="${escapeAttr(input.id)}" class="section-header api-section-header${cls}">` +
67
+ `${escapeHtml(input.text)}` +
68
+ ` <a class="anchor api-anchor" href="#${escapeAttr(input.id)}">§</a>` +
69
+ `</h${input.level}>`);
70
+ }
71
+ export function escapeHtml(value) {
72
+ return sharedEscapeHtml(value);
73
+ }
74
+ export function escapeAttr(value) {
75
+ return sharedEscapeAttr(value);
76
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"doxygen-loader.d.ts","sourceRoot":"","sources":["../../src/core/doxygen-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAA6B,MAAM,iBAAiB,CAAC;AAM1E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMzF;AAED,wBAAgB,kCAAkC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAoB9E;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIxE;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAShE;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAcrE;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAoGxB"}
1
+ {"version":3,"file":"doxygen-loader.d.ts","sourceRoot":"","sources":["../../src/core/doxygen-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAO7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAA6B,MAAM,iBAAiB,CAAC;AAM1E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMzF;AAED,wBAAgB,kCAAkC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAoB9E;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOxE;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOhE;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBrE;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CA4GxB"}
@@ -1,5 +1,5 @@
1
1
  import { generate } from "moxygen";
2
- import { renderMarkdown, extractHeadings, extractFirstParagraph, stripMarkdownLinks } from "../utils/markdown.js";
2
+ import { renderMarkdown, extractHeadings, extractFirstParagraph, stripMarkdownLinks, } from "../utils/markdown.js";
3
3
  export function normalizeDoxygenDescription(description, markdown) {
4
4
  if (!description)
5
5
  return "";
@@ -35,9 +35,7 @@ export function rewriteGeneratedDoxygenHref(href) {
35
35
  const [path, hash] = href.split("#", 2);
36
36
  if (!path.startsWith("api_") || !path.endsWith(".md"))
37
37
  return href;
38
- const slug = path
39
- .slice("api_".length, -".md".length)
40
- .replace(/--/g, "-");
38
+ const slug = path.slice("api_".length, -".md".length).replace(/--/g, "-");
41
39
  return `${slug}.html${hash ? `#${hash}` : ""}`;
42
40
  }
43
41
  export function rewriteGeneratedDoxygenHtmlLinks(html) {
@@ -56,12 +54,19 @@ export function rewriteGeneratedDoxygenHtmlLinks(html) {
56
54
  });
57
55
  }
58
56
  export async function loadDoxygenTab(config, tabSlug, tabLabel) {
59
- const generated = await generate({
60
- directory: config.xml,
61
- language: config.language,
62
- sourceUrl: config.sourceUrl,
63
- quiet: true,
64
- });
57
+ let generated;
58
+ try {
59
+ generated = await generate({
60
+ directory: config.xml,
61
+ language: config.language,
62
+ sourceUrl: config.sourceUrl,
63
+ quiet: true,
64
+ });
65
+ }
66
+ catch (error) {
67
+ const message = error instanceof Error ? error.message : String(error);
68
+ throw new Error(`Failed to load Doxygen XML from ${config.xml}: ${message}`);
69
+ }
65
70
  const pages = new Map();
66
71
  const groupMap = new Map();
67
72
  for (const page of generated) {
@@ -200,7 +205,9 @@ function buildRichIndex(groupMap, pages) {
200
205
  cards.push(`<a href="${href}" class="card-item">` +
201
206
  `<div class="card-item-inner">` +
202
207
  `<h3 class="card-item-title">${escHtml(page.title)}</h3>` +
203
- (desc ? `<div class="card-item-content"><p>${escHtml(desc)}</p>${meta}</div>` : `<div class="card-item-content">${meta}</div>`) +
208
+ (desc
209
+ ? `<div class="card-item-content"><p>${escHtml(desc)}</p>${meta}</div>`
210
+ : `<div class="card-item-content">${meta}</div>`) +
204
211
  `</div></a>`);
205
212
  }
206
213
  // Also include groups without a group page (orphan namespaces)
@@ -280,15 +287,25 @@ function lastSegment(name) {
280
287
  return parts[parts.length - 1] || name;
281
288
  }
282
289
  function escHtml(s) {
283
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
290
+ return s
291
+ .replace(/&/g, "&amp;")
292
+ .replace(/</g, "&lt;")
293
+ .replace(/>/g, "&gt;")
294
+ .replace(/"/g, "&quot;");
284
295
  }
285
296
  function kindLabel(kind) {
286
297
  switch (kind) {
287
- case "class": return "Classes";
288
- case "struct": return "Structs";
289
- case "enum": return "Enums";
290
- case "union": return "Unions";
291
- case "typedef": return "Type Aliases";
292
- default: return kind.charAt(0).toUpperCase() + kind.slice(1) + "s";
298
+ case "class":
299
+ return "Classes";
300
+ case "struct":
301
+ return "Structs";
302
+ case "enum":
303
+ return "Enums";
304
+ case "union":
305
+ return "Unions";
306
+ case "typedef":
307
+ return "Type Aliases";
308
+ default:
309
+ return kind.charAt(0).toUpperCase() + kind.slice(1) + "s";
293
310
  }
294
311
  }
@@ -1 +1 @@
1
- {"version":3,"file":"godoc-loader.d.ts","sourceRoot":"","sources":["../../src/core/godoc-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAiBxD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAA6B,MAAM,iBAAiB,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,sBAA2B,GACvC,OAAO,CAAC,iBAAiB,CAAC,CAG5B"}
1
+ {"version":3,"file":"godoc-loader.d.ts","sourceRoot":"","sources":["../../src/core/godoc-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAaxD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAA6B,MAAM,iBAAiB,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,sBAA2B,GACvC,OAAO,CAAC,iBAAiB,CAAC,CAG5B"}
@@ -2,7 +2,7 @@ import { readFile } from "node:fs/promises";
2
2
  import { spawnSync } from "node:child_process";
3
3
  import { GODOC_SCHEMA_VERSION } from "./godoc-types.js";
4
4
  import { runIntrospector, GodocIntrospectorError } from "./godoc-introspector.js";
5
- import { renderCodeBlock, renderMarkdown, } from "../utils/markdown.js";
5
+ import { renderCodeBlock, renderMarkdown } from "../utils/markdown.js";
6
6
  /**
7
7
  * Resolve a configured godoc tab into pre-rendered Sourcey pages plus a
8
8
  * navigation tab. Honours `mode: "live" | "snapshot" | "auto"`:
@@ -32,7 +32,18 @@ async function loadSpec(config) {
32
32
  return runIntrospector({ config });
33
33
  }
34
34
  if (config.snapshot) {
35
- return loadSnapshot(config.snapshot, config.module);
35
+ const spec = await loadSnapshot(config.snapshot, config.module);
36
+ return {
37
+ ...spec,
38
+ diagnostics: [
39
+ {
40
+ severity: "info",
41
+ code: "GODOC_AUTO_FELL_BACK_TO_SNAPSHOT",
42
+ message: "godoc auto mode did not find Go on PATH and used the configured snapshot.",
43
+ },
44
+ ...spec.diagnostics,
45
+ ],
46
+ };
36
47
  }
37
48
  throw new GodocIntrospectorError("GO_NOT_FOUND", "godoc mode is 'auto' and Go is not on PATH. Install Go or set " +
38
49
  "mode: 'snapshot' with a committed godoc.json.");
@@ -455,7 +466,9 @@ function sourceURL(position, sourceLinks) {
455
466
  if (!position || !sourceLinks.repo || !sourceLinks.editBranch)
456
467
  return undefined;
457
468
  const repoBase = sourceLinks.repo.replace(/\/$/, "");
458
- const basePath = sourceLinks.editBasePath ? `${sourceLinks.editBasePath.replace(/^\/|\/$/g, "")}/` : "";
469
+ const basePath = sourceLinks.editBasePath
470
+ ? `${sourceLinks.editBasePath.replace(/^\/|\/$/g, "")}/`
471
+ : "";
459
472
  return `${repoBase}/blob/${sourceLinks.editBranch}/${basePath}${position.file}#L${position.line}`;
460
473
  }
461
474
  function renderExample(ex) {
@@ -472,9 +485,7 @@ function renderExample(ex) {
472
485
  return parts.join("\n");
473
486
  }
474
487
  function humaniseSuffix(suffix) {
475
- return suffix
476
- .replace(/_/g, " ")
477
- .replace(/\b\w/g, (c) => c.toUpperCase());
488
+ return suffix.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
478
489
  }
479
490
  function renderDoc(input) {
480
491
  return renderMarkdown(input).trim();
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-loader.d.ts","sourceRoot":"","sources":["../../src/core/markdown-loader.ts"],"names":[],"mappings":"AAMA,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAMtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kFAAkF;IAClF,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC;IAClC,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC;AAEpD,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUxD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,KAAK,MAAM,CAAC;AAknChG;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAK5F;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,QAAQ,CAAC,CAgCnB;AA+DD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOrD"}
1
+ {"version":3,"file":"markdown-loader.d.ts","sourceRoot":"","sources":["../../src/core/markdown-loader.ts"],"names":[],"mappings":"AAOA,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAMtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kFAAkF;IAClF,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC;IAClC,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC;AAEpD,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUxD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,KAAK,MAAM,CAAC;AAonChG;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAK5F;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,QAAQ,CAAC,CAgCnB;AA+DD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOrD"}
@@ -3,6 +3,7 @@ import { basename, extname, relative } from "node:path";
3
3
  import { load as parseYaml } from "js-yaml";
4
4
  import { normalizeChangelog } from "./changelog-normalizer.js";
5
5
  import { htmlId } from "../utils/html-id.js";
6
+ import { escapeAttr, safeUrl } from "../utils/html.js";
6
7
  import { renderIcon } from "../utils/icons.js";
7
8
  import { renderCodeBlock, renderMarkdown, renderMarkdownInline, extractHeadings, extractFirstParagraph, stripMarkdownLinks, } from "../utils/markdown.js";
8
9
  // ---------------------------------------------------------------------------
@@ -453,8 +454,9 @@ ${body}
453
454
  const cols = node.attrs.cols || "2";
454
455
  const cardHtml = cards
455
456
  .map((card) => {
456
- const tag = card.attrs.href ? "a" : "div";
457
- const href = card.attrs.href ? ` href="${escapeHtmlAttr(card.attrs.href)}"` : "";
457
+ const safeHref = card.attrs.href ? safeUrl(card.attrs.href) : null;
458
+ const tag = safeHref ? "a" : "div";
459
+ const href = safeHref ? ` href="${escapeHtmlAttr(safeHref)}"` : "";
458
460
  const iconHtml = renderIcon(card.attrs.icon || "");
459
461
  const title = renderMarkdownInline(card.attrs.title || "").trim();
460
462
  const body = renderComponentChildrenToHtml(card.children);
@@ -565,7 +567,7 @@ function escapeRegExp(value) {
565
567
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
566
568
  }
567
569
  function escapeHtmlAttr(value) {
568
- return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
570
+ return escapeAttr(value);
569
571
  }
570
572
  function stripDirectiveIndent(line) {
571
573
  return line.replace(/^ {0,3}/, "");
@@ -824,8 +826,9 @@ ${body}
824
826
  if (type === "card-group") {
825
827
  const cols = parseAttrs(meta.match(/^\{([^}]*)\}$/)?.[1] ?? "").cols || "2";
826
828
  const cards = splitChildren(content, "card").map((child) => {
827
- const tag = child.attrs.href ? "a" : "div";
828
- const href = child.attrs.href ? ` href="${escapeHtmlAttr(child.attrs.href)}"` : "";
829
+ const safeHref = child.attrs.href ? safeUrl(child.attrs.href) : null;
830
+ const tag = safeHref ? "a" : "div";
831
+ const href = safeHref ? ` href="${escapeHtmlAttr(safeHref)}"` : "";
829
832
  const iconHtml = renderIcon(child.attrs.icon || "");
830
833
  const title = renderMarkdownInline(child.attrs.title || "").trim();
831
834
  const body = renderDirectiveMarkdown(child.body);
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-normalizer.d.ts","sourceRoot":"","sources":["../../src/core/mcp-normalizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAoE,MAAM,YAAY,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EASf,MAAM,YAAY,CAAC;AAKpB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CA+C9D"}
1
+ {"version":3,"file":"mcp-normalizer.d.ts","sourceRoot":"","sources":["../../src/core/mcp-normalizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,OAAO,EAMR,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,cAAc,EASf,MAAM,YAAY,CAAC;AAKpB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAwD9D"}