sourcey 3.5.10 → 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 (100) hide show
  1. package/README.md +24 -97
  2. package/dist/adapters/index.d.ts +12 -0
  3. package/dist/adapters/index.d.ts.map +1 -0
  4. package/dist/adapters/index.js +130 -0
  5. package/dist/adapters/mkdocs.d.ts +5 -0
  6. package/dist/adapters/mkdocs.d.ts.map +1 -0
  7. package/dist/adapters/mkdocs.js +367 -0
  8. package/dist/adapters/shared.d.ts +12 -0
  9. package/dist/adapters/shared.d.ts.map +1 -0
  10. package/dist/adapters/shared.js +134 -0
  11. package/dist/adapters/types.d.ts +74 -0
  12. package/dist/adapters/types.d.ts.map +1 -0
  13. package/dist/adapters/types.js +1 -0
  14. package/dist/cli.js +28 -34
  15. package/dist/client/search.js +213 -82
  16. package/dist/client/tabs.js +23 -0
  17. package/dist/components/layout/Head.js +17 -4
  18. package/dist/components/layout/TableOfContents.d.ts.map +1 -1
  19. package/dist/components/layout/TableOfContents.js +4 -2
  20. package/dist/components/openapi/Introduction.d.ts.map +1 -1
  21. package/dist/components/openapi/Introduction.js +16 -1
  22. package/dist/components/openapi/Security.d.ts.map +1 -1
  23. package/dist/components/openapi/Security.js +18 -2
  24. package/dist/config.d.ts +101 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +95 -143
  27. package/dist/core/api-rendering.d.ts +47 -0
  28. package/dist/core/api-rendering.d.ts.map +1 -0
  29. package/dist/core/api-rendering.js +76 -0
  30. package/dist/core/doxygen-loader.d.ts.map +1 -1
  31. package/dist/core/doxygen-loader.js +36 -17
  32. package/dist/core/godoc-loader.d.ts.map +1 -1
  33. package/dist/core/godoc-loader.js +17 -6
  34. package/dist/core/markdown-loader.d.ts +14 -0
  35. package/dist/core/markdown-loader.d.ts.map +1 -1
  36. package/dist/core/markdown-loader.js +70 -26
  37. package/dist/core/mcp-normalizer.d.ts.map +1 -1
  38. package/dist/core/mcp-normalizer.js +48 -34
  39. package/dist/core/navigation.d.ts.map +1 -1
  40. package/dist/core/navigation.js +8 -7
  41. package/dist/core/parser.d.ts.map +1 -1
  42. package/dist/core/parser.js +75 -4
  43. package/dist/core/rustdoc-introspector.d.ts +29 -0
  44. package/dist/core/rustdoc-introspector.d.ts.map +1 -0
  45. package/dist/core/rustdoc-introspector.js +236 -0
  46. package/dist/core/rustdoc-loader.d.ts +25 -0
  47. package/dist/core/rustdoc-loader.d.ts.map +1 -0
  48. package/dist/core/rustdoc-loader.js +469 -0
  49. package/dist/core/rustdoc-render.d.ts +76 -0
  50. package/dist/core/rustdoc-render.d.ts.map +1 -0
  51. package/dist/core/rustdoc-render.js +785 -0
  52. package/dist/core/rustdoc-types.d.ts +314 -0
  53. package/dist/core/rustdoc-types.d.ts.map +1 -0
  54. package/dist/core/rustdoc-types.js +18 -0
  55. package/dist/core/search-indexer.d.ts +10 -0
  56. package/dist/core/search-indexer.d.ts.map +1 -1
  57. package/dist/core/search-indexer.js +6 -1
  58. package/dist/core/sourcey-rustdoc/Cargo.lock +705 -0
  59. package/dist/core/sourcey-rustdoc/Cargo.toml +38 -0
  60. package/dist/core/sourcey-rustdoc/README.md +59 -0
  61. package/dist/core/sourcey-rustdoc/src/diagnostics.rs +42 -0
  62. package/dist/core/sourcey-rustdoc/src/doctest.rs +268 -0
  63. package/dist/core/sourcey-rustdoc/src/extract.rs +492 -0
  64. package/dist/core/sourcey-rustdoc/src/lib.rs +58 -0
  65. package/dist/core/sourcey-rustdoc/src/links.rs +126 -0
  66. package/dist/core/sourcey-rustdoc/src/main.rs +256 -0
  67. package/dist/core/sourcey-rustdoc/src/signature.rs +415 -0
  68. package/dist/core/sourcey-rustdoc/src/spec.rs +390 -0
  69. package/dist/core/sourcey-rustdoc/tests/format_version.rs +45 -0
  70. package/dist/dev-server.d.ts.map +1 -1
  71. package/dist/dev-server.js +109 -33
  72. package/dist/index.d.ts +4 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +26 -14
  75. package/dist/init.d.ts.map +1 -1
  76. package/dist/init.js +21 -16
  77. package/dist/renderer/changelog-feed.d.ts.map +1 -1
  78. package/dist/renderer/changelog-feed.js +27 -19
  79. package/dist/renderer/html-builder.d.ts.map +1 -1
  80. package/dist/renderer/html-builder.js +4 -3
  81. package/dist/renderer/llms.js +57 -2
  82. package/dist/site-assembly.d.ts +5 -0
  83. package/dist/site-assembly.d.ts.map +1 -1
  84. package/dist/site-assembly.js +161 -25
  85. package/dist/themes/default/sourcey.css +300 -0
  86. package/dist/utils/code-samples.d.ts +1 -0
  87. package/dist/utils/code-samples.d.ts.map +1 -1
  88. package/dist/utils/code-samples.js +30 -22
  89. package/dist/utils/html.d.ts +10 -0
  90. package/dist/utils/html.d.ts.map +1 -0
  91. package/dist/utils/html.js +152 -0
  92. package/dist/utils/http.d.ts +0 -2
  93. package/dist/utils/http.d.ts.map +1 -1
  94. package/dist/utils/http.js +19 -34
  95. package/dist/utils/markdown.d.ts.map +1 -1
  96. package/dist/utils/markdown.js +115 -39
  97. package/dist/vite-plugin.d.ts +2 -0
  98. package/dist/vite-plugin.d.ts.map +1 -1
  99. package/dist/vite-plugin.js +71 -1
  100. package/package.json +11 -5
@@ -1 +1 @@
1
- {"version":3,"file":"Security.d.ts","sourceRoot":"","sources":["../../../src/components/openapi/Security.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAK/D,UAAU,aAAa;IACrB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,uCA+CvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,wCA8FlC"}
1
+ {"version":3,"file":"Security.d.ts","sourceRoot":"","sources":["../../../src/components/openapi/Security.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAM/D,UAAU,aAAa;IACrB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,uCAmDvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,wCAoIlC"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "preact/jsx-runtime";
2
2
  import { useContext } from "preact/hooks";
3
3
  import { SpecContext } from "../../renderer/context.js";
4
+ import { safeUrl } from "../../utils/html.js";
4
5
  import { SectionLabel } from "../ui/SectionLabel.js";
5
6
  import { Markdown } from "../ui/Markdown.js";
6
7
  import { DeprecatedBadge } from "../ui/Badge.js";
@@ -16,7 +17,7 @@ export function SecurityCopy({ security }) {
16
17
  return null;
17
18
  return (_jsxs("div", { class: "mt-6", children: [_jsx(SectionLabel, { children: "Authorization" }), _jsx("div", { children: security.map((req, i) => (_jsx("div", { class: "params-list", children: Object.entries(req).map(([name, scopes]) => {
18
19
  const scheme = spec.securitySchemes[name];
19
- return (_jsxs("div", { class: "param-item", children: [_jsxs("div", { class: "param-header", children: [_jsx("code", { class: "param-name", children: name }), scheme && (_jsx("span", { class: "param-type", children: _jsxs("span", { class: "json-property-type", children: [scheme.type, scheme.scheme && ` (${scheme.scheme})`, scheme.in && ` in ${scheme.in}`] }) })), scheme?.deprecated && _jsx(DeprecatedBadge, {})] }), (scheme?.description || scopes.length > 0) && (_jsxs("div", { class: "param-description", children: [scheme?.description && _jsx(Markdown, { content: scheme.description, class: "prose-sm" }), scopes.length > 0 && (_jsxs("p", { class: "mt-1", children: ["Scopes: ", _jsx("code", { class: "text-xs font-medium", children: scopes.join(", ") })] }))] }))] }, name));
20
+ return (_jsxs("div", { class: "param-item", children: [_jsxs("div", { class: "param-header", children: [_jsx("code", { class: "param-name", children: name }), scheme && (_jsx("span", { class: "param-type", children: _jsxs("span", { class: "json-property-type", children: [scheme.type, scheme.scheme && ` (${scheme.scheme})`, scheme.in && ` in ${scheme.in}`] }) })), scheme?.deprecated && _jsx(DeprecatedBadge, {})] }), (scheme?.description || scopes.length > 0) && (_jsxs("div", { class: "param-description", children: [scheme?.description && (_jsx(Markdown, { content: scheme.description, class: "prose-sm" })), scopes.length > 0 && (_jsxs("p", { class: "mt-1", children: ["Scopes: ", _jsx("code", { class: "text-xs font-medium", children: scopes.join(", ") })] }))] }))] }, name));
20
21
  }) }, i))) })] }));
21
22
  }
22
23
  /**
@@ -27,5 +28,20 @@ export function SecurityDefinitions() {
27
28
  const schemes = Object.entries(spec.securitySchemes);
28
29
  if (!schemes.length)
29
30
  return null;
30
- return (_jsxs("div", { id: "authentication", class: "py-8 border-t border-[rgb(var(--color-gray-100))] dark:border-[rgb(var(--color-gray-800))]", "data-traverse-target": "authentication", children: [_jsx("h2", { class: "text-xl font-bold text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))] mb-4", children: "Authentication" }), _jsx("div", { class: "params-list", children: schemes.map(([name, scheme]) => (_jsxs("div", { class: "param-item", children: [_jsxs("div", { class: "param-header", children: [_jsx("code", { class: "param-name", children: name }), _jsx("span", { class: "param-type", children: _jsx("span", { class: "json-property-type", children: scheme.type }) }), scheme.deprecated && _jsx(DeprecatedBadge, {})] }), _jsxs("div", { class: "param-description", children: [scheme.description && _jsx(Markdown, { content: scheme.description, class: "prose-sm" }), scheme.type === "apiKey" && (_jsxs("p", { class: "mt-1", children: ["API Key: ", _jsx("code", { class: "text-xs font-medium", children: scheme.name }), " in ", scheme.in] })), scheme.type === "http" && (_jsxs("p", { class: "mt-1", children: ["Scheme: ", scheme.scheme, scheme.bearerFormat && ` (${scheme.bearerFormat})`] })), scheme.type === "oauth2" && scheme.oauth2MetadataUrl && (_jsxs("p", { class: "mt-1", children: ["OAuth2 Metadata:", " ", _jsx("a", { href: scheme.oauth2MetadataUrl, class: "text-[rgb(var(--color-primary-ink))] dark:text-[rgb(var(--color-primary-light))]", children: scheme.oauth2MetadataUrl })] })), scheme.type === "oauth2" && scheme.flows && (_jsx("div", { class: "mt-2 space-y-4", children: Object.entries(scheme.flows).map(([flowType, flow]) => (_jsxs("div", { children: [_jsx("strong", { class: "text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))]", children: flowType }), _jsxs("dl", { class: "mt-2 text-sm", children: [flow?.authorizationUrl && (_jsxs(_Fragment, { children: [_jsx("dt", { class: "text-[rgb(var(--color-gray-500))] mt-2", children: "Authorization URL" }), _jsx("dd", { children: _jsx("code", { class: "text-xs", children: flow.authorizationUrl }) })] })), flow?.deviceAuthorizationUrl && (_jsxs(_Fragment, { children: [_jsx("dt", { class: "text-[rgb(var(--color-gray-500))] mt-2", children: "Device Authorization URL" }), _jsx("dd", { children: _jsx("code", { class: "text-xs", children: flow.deviceAuthorizationUrl }) })] })), flow?.tokenUrl && (_jsxs(_Fragment, { children: [_jsx("dt", { class: "text-[rgb(var(--color-gray-500))] mt-2", children: "Token URL" }), _jsx("dd", { children: _jsx("code", { class: "text-xs", children: flow.tokenUrl }) })] }))] }), flow?.scopes && Object.keys(flow.scopes).length > 0 && (_jsxs("div", { class: "mt-3", children: [_jsx("span", { class: "text-sm text-[rgb(var(--color-gray-500))]", children: "Scopes" }), _jsx("ul", { class: "mt-1 space-y-1", children: Object.entries(flow.scopes).map(([s, desc]) => (_jsxs("li", { class: "text-sm", children: [_jsx("code", { class: "text-xs font-medium text-[rgb(var(--color-gray-800))] dark:text-[rgb(var(--color-gray-200))]", children: s }), _jsxs("span", { class: "text-[rgb(var(--color-gray-500))] ml-2", children: ["\u2014 ", desc] })] }, s))) })] }))] }, flowType))) })), scheme.type === "openIdConnect" && scheme.openIdConnectUrl && (_jsxs("p", { class: "mt-1", children: ["OpenID Connect:", " ", _jsx("a", { href: scheme.openIdConnectUrl, class: "text-[rgb(var(--color-primary-ink))] dark:text-[rgb(var(--color-primary-light))]", children: scheme.openIdConnectUrl })] }))] })] }, name))) })] }));
31
+ return (_jsxs("div", { id: "authentication", class: "py-8 border-t border-[rgb(var(--color-gray-100))] dark:border-[rgb(var(--color-gray-800))]", "data-traverse-target": "authentication", children: [_jsx("h2", { class: "text-xl font-bold text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))] mb-4", children: "Authentication" }), _jsx("div", { class: "params-list", children: schemes.map(([name, scheme]) => {
32
+ const oauth2MetadataUrl = scheme.oauth2MetadataUrl
33
+ ? safeExternalSpecUrl(scheme.oauth2MetadataUrl)
34
+ : null;
35
+ const openIdConnectUrl = scheme.openIdConnectUrl
36
+ ? safeExternalSpecUrl(scheme.openIdConnectUrl)
37
+ : null;
38
+ return (_jsxs("div", { class: "param-item", children: [_jsxs("div", { class: "param-header", children: [_jsx("code", { class: "param-name", children: name }), _jsx("span", { class: "param-type", children: _jsx("span", { class: "json-property-type", children: scheme.type }) }), scheme.deprecated && _jsx(DeprecatedBadge, {})] }), _jsxs("div", { class: "param-description", children: [scheme.description && _jsx(Markdown, { content: scheme.description, class: "prose-sm" }), scheme.type === "apiKey" && (_jsxs("p", { class: "mt-1", children: ["API Key: ", _jsx("code", { class: "text-xs font-medium", children: scheme.name }), " in ", scheme.in] })), scheme.type === "http" && (_jsxs("p", { class: "mt-1", children: ["Scheme: ", scheme.scheme, scheme.bearerFormat && ` (${scheme.bearerFormat})`] })), scheme.type === "oauth2" && oauth2MetadataUrl && (_jsxs("p", { class: "mt-1", children: ["OAuth2 Metadata:", " ", _jsx("a", { href: oauth2MetadataUrl, class: "text-[rgb(var(--color-primary-ink))] dark:text-[rgb(var(--color-primary-light))]", children: scheme.oauth2MetadataUrl })] })), scheme.type === "oauth2" && scheme.flows && (_jsx("div", { class: "mt-2 space-y-4", children: Object.entries(scheme.flows).map(([flowType, flow]) => (_jsxs("div", { children: [_jsx("strong", { class: "text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))]", children: flowType }), _jsxs("dl", { class: "mt-2 text-sm", children: [flow?.authorizationUrl && (_jsxs(_Fragment, { children: [_jsx("dt", { class: "text-[rgb(var(--color-gray-500))] mt-2", children: "Authorization URL" }), _jsx("dd", { children: _jsx("code", { class: "text-xs", children: flow.authorizationUrl }) })] })), flow?.deviceAuthorizationUrl && (_jsxs(_Fragment, { children: [_jsx("dt", { class: "text-[rgb(var(--color-gray-500))] mt-2", children: "Device Authorization URL" }), _jsx("dd", { children: _jsx("code", { class: "text-xs", children: flow.deviceAuthorizationUrl }) })] })), flow?.tokenUrl && (_jsxs(_Fragment, { children: [_jsx("dt", { class: "text-[rgb(var(--color-gray-500))] mt-2", children: "Token URL" }), _jsx("dd", { children: _jsx("code", { class: "text-xs", children: flow.tokenUrl }) })] }))] }), flow?.scopes && Object.keys(flow.scopes).length > 0 && (_jsxs("div", { class: "mt-3", children: [_jsx("span", { class: "text-sm text-[rgb(var(--color-gray-500))]", children: "Scopes" }), _jsx("ul", { class: "mt-1 space-y-1", children: Object.entries(flow.scopes).map(([s, desc]) => (_jsxs("li", { class: "text-sm", children: [_jsx("code", { class: "text-xs font-medium text-[rgb(var(--color-gray-800))] dark:text-[rgb(var(--color-gray-200))]", children: s }), _jsxs("span", { class: "text-[rgb(var(--color-gray-500))] ml-2", children: ["- ", desc] })] }, s))) })] }))] }, flowType))) })), scheme.type === "openIdConnect" && openIdConnectUrl && (_jsxs("p", { class: "mt-1", children: ["OpenID Connect:", " ", _jsx("a", { href: openIdConnectUrl, class: "text-[rgb(var(--color-primary-ink))] dark:text-[rgb(var(--color-primary-light))]", children: scheme.openIdConnectUrl })] }))] })] }, name));
39
+ }) })] }));
40
+ }
41
+ function safeExternalSpecUrl(value) {
42
+ return safeUrl(value, {
43
+ allowedProtocols: ["http:", "https:"],
44
+ allowRelative: false,
45
+ allowAnchor: false,
46
+ });
31
47
  }
package/dist/config.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import type { PrettyUrls } from "./site-url.js";
2
+ import type { MarkdownPreprocessor } from "./core/markdown-loader.js";
3
+ import type { ResolvedTabSource, SourceAdapter } from "./adapters/types.js";
2
4
  export type { PrettyUrls } from "./site-url.js";
3
5
  export type ThemePreset = "default" | "minimal" | "api-first";
4
6
  export interface ThemeConfig {
@@ -88,6 +90,21 @@ export interface SourceyConfig {
88
90
  };
89
91
  }
90
92
  export type DoxygenIndexStyle = "auto" | "rich" | "structured" | "flat" | "none";
93
+ export interface DoxygenSourceUrlInput {
94
+ path: string;
95
+ line?: string;
96
+ symbol?: string;
97
+ }
98
+ export interface DoxygenSourceUrlRoute {
99
+ /** Doxygen source path prefix. Longest matching prefix wins. */
100
+ prefix: string;
101
+ /**
102
+ * Base URL or template for this route. Omit or set false to suppress public
103
+ * links while still rendering the plain "Defined in path:line" location.
104
+ */
105
+ url?: string | false;
106
+ }
107
+ export type DoxygenSourceUrlResolver = string | DoxygenSourceUrlRoute[] | ((input: DoxygenSourceUrlInput) => string | undefined);
91
108
  export interface DoxygenConfig {
92
109
  /** Path to Doxygen XML output directory */
93
110
  xml: string;
@@ -104,6 +121,14 @@ export interface DoxygenConfig {
104
121
  * - "none" or false: no index page, land on the first API page
105
122
  */
106
123
  index?: DoxygenIndexStyle | false;
124
+ /**
125
+ * Base URL or template for source links in generated API pages.
126
+ * A plain URL is joined with the Doxygen file path and "#L<line>".
127
+ * Templates may use {path}, {fullPath}, and {line}. In route maps,
128
+ * {path} is the matched-prefix-relative path and {fullPath} is the original
129
+ * Doxygen path.
130
+ */
131
+ sourceUrl?: DoxygenSourceUrlResolver;
107
132
  }
108
133
  export type GodocMode = "auto" | "live" | "snapshot";
109
134
  export interface GodocGoEnv {
@@ -111,6 +136,63 @@ export interface GodocGoEnv {
111
136
  GOARCH?: string;
112
137
  tags?: string[];
113
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
+ }
114
196
  export interface GodocConfig {
115
197
  /** Module root (directory containing go.mod). Defaults to the directory containing sourcey.config.ts. */
116
198
  module?: string;
@@ -148,7 +230,11 @@ export interface TabConfig {
148
230
  tab: string;
149
231
  /** Custom URL slug for this tab. Defaults to slugified tab name. */
150
232
  slug?: string;
233
+ /** Source adapter object, usually created with `mkdocs()`, `openapi()`, `markdown()`, `doxygen()`, `godoc()`, or `mcp()`. */
234
+ source?: SourceAdapter;
151
235
  openapi?: string;
236
+ /** Path to a MkDocs mkdocs.yml/mkdocs.yaml file. Sourcey imports docs_dir and nav. */
237
+ mkdocs?: string;
152
238
  groups?: GroupConfig[];
153
239
  doxygen?: DoxygenConfig;
154
240
  /** Path to an mcp.json file (MCP server snapshot). */
@@ -158,6 +244,11 @@ export interface TabConfig {
158
244
  * `{ module: <value>, packages: ["./..."], mode: "auto", includeTests: true }`.
159
245
  */
160
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;
161
252
  }
162
253
  export interface GroupConfig {
163
254
  group: string;
@@ -237,6 +328,7 @@ export interface ResolvedDoxygenConfig {
237
328
  language: string;
238
329
  groups: boolean;
239
330
  index: DoxygenIndexStyle;
331
+ sourceUrl?: DoxygenSourceUrlResolver;
240
332
  }
241
333
  export interface ResolvedGodocConfig {
242
334
  /** Absolute path to the Go module directory (containing go.mod). */
@@ -256,17 +348,26 @@ export interface ResolvedGodocConfig {
256
348
  export interface ResolvedTab {
257
349
  label: string;
258
350
  slug: string;
351
+ source: ResolvedTabSource;
259
352
  openapi?: string;
353
+ mkdocs?: string;
260
354
  groups?: ResolvedGroup[];
261
355
  doxygen?: ResolvedDoxygenConfig;
262
356
  mcp?: string;
263
357
  godoc?: ResolvedGodocConfig;
358
+ rustdoc?: ResolvedRustdocConfig;
264
359
  }
265
360
  export interface ResolvedPage {
266
361
  /** Original config slug (e.g. "run/index") */
267
362
  slug: string;
268
363
  /** Absolute filesystem path to the .md/.mdx file */
269
364
  file: string;
365
+ /** Optional navigation label supplied by a source format such as MkDocs. */
366
+ label?: string;
367
+ /** Optional source root used for source-format-relative includes and assets. */
368
+ sourceRoot?: string;
369
+ /** Optional source-adapter Markdown preprocessors. */
370
+ preprocess?: MarkdownPreprocessor[];
270
371
  }
271
372
  export interface ResolvedGroup {
272
373
  label: string;
@@ -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
@@ -1,7 +1,9 @@
1
- import { access, readdir } from "node:fs/promises";
2
- import { resolve, relative, dirname, basename, extname } from "node:path";
1
+ import { access } from "node:fs/promises";
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, rustdoc as rustdocSource, } from "./adapters/index.js";
6
+ import { DEFAULT_CODE_SAMPLE_LANGS, SUPPORTED_CODE_SAMPLE_LANGS } from "./utils/code-samples.js";
5
7
  export function defineConfig(config) {
6
8
  return config;
7
9
  }
@@ -40,7 +42,7 @@ export async function loadConfig(configOrDir) {
40
42
  ` export default defineConfig({ navigation: { tabs: [...] } });\n`);
41
43
  }
42
44
  const jiti = createJiti(import.meta.url);
43
- const mod = await jiti.import(configPath);
45
+ const mod = (await jiti.import(configPath));
44
46
  const raw = mod.default;
45
47
  if (!raw?.navigation?.tabs) {
46
48
  throw new Error("sourcey.config.ts must export default defineConfig({ navigation: { tabs: [...] } })");
@@ -60,12 +62,23 @@ export function configFromSpec(specPath) {
60
62
  theme: {
61
63
  preset: "default",
62
64
  colors: { ...DEFAULT_COLORS },
63
- fonts: { sans: `'${DEFAULT_FONT_SANS}', ${SYSTEM_SANS}`, mono: SYSTEM_MONO, googleFont: DEFAULT_FONT_SANS },
65
+ fonts: {
66
+ sans: `'${DEFAULT_FONT_SANS}', ${SYSTEM_SANS}`,
67
+ mono: SYSTEM_MONO,
68
+ googleFont: DEFAULT_FONT_SANS,
69
+ },
64
70
  layout: { ...DEFAULT_LAYOUT },
65
71
  css: [],
66
72
  },
67
73
  codeSamples: ["curl", "javascript", "python"],
68
- tabs: [{ label: "API Reference", slug: "api", openapi: absSpec }],
74
+ tabs: [
75
+ {
76
+ label: "API Reference",
77
+ slug: "api",
78
+ source: { kind: "openapi", spec: absSpec, watchPaths: [absSpec] },
79
+ openapi: absSpec,
80
+ },
81
+ ],
69
82
  navbar: { links: [] },
70
83
  footer: { links: [] },
71
84
  changelog: { enabled: true, feed: false, permalinks: false, ogImages: false },
@@ -87,12 +100,16 @@ export async function resolveConfigFromRaw(raw, configDir) {
87
100
  prettyUrls: resolvePrettyUrls(raw.prettyUrls),
88
101
  theme,
89
102
  logo,
90
- favicon: raw.favicon && !raw.favicon.startsWith("http") && !raw.favicon.startsWith("data:") ? resolve(configDir, raw.favicon) : raw.favicon,
91
- ogImage: raw.ogImage && !raw.ogImage.startsWith("http") && !raw.ogImage.startsWith("data:") ? resolve(configDir, raw.ogImage) : raw.ogImage,
103
+ favicon: raw.favicon && !raw.favicon.startsWith("http") && !raw.favicon.startsWith("data:")
104
+ ? resolve(configDir, raw.favicon)
105
+ : raw.favicon,
106
+ ogImage: raw.ogImage && !raw.ogImage.startsWith("http") && !raw.ogImage.startsWith("data:")
107
+ ? resolve(configDir, raw.ogImage)
108
+ : raw.ogImage,
92
109
  repo: raw.repo,
93
110
  editBranch: raw.editBranch,
94
111
  editBasePath: raw.editBasePath,
95
- codeSamples: raw.codeSamples ?? ["curl", "javascript", "python"],
112
+ codeSamples: resolveCodeSamples(raw.codeSamples),
96
113
  tabs,
97
114
  navbar: {
98
115
  links: raw.navbar?.links ?? [],
@@ -136,7 +153,7 @@ function resolveTheme(raw, configDir) {
136
153
  toc: raw.theme?.layout?.toc ?? DEFAULT_LAYOUT.toc,
137
154
  content: raw.theme?.layout?.content ?? DEFAULT_LAYOUT.content,
138
155
  };
139
- const css = (raw.theme?.css ?? []).map(p => resolve(configDir, p));
156
+ const css = (raw.theme?.css ?? []).map((p) => resolve(configDir, p));
140
157
  return { preset, colors, fonts, layout, css };
141
158
  }
142
159
  function resolveLogo(logo, configDir) {
@@ -163,154 +180,84 @@ async function resolveTabs(tabs, configDir) {
163
180
  const resolved = [];
164
181
  for (const tab of tabs) {
165
182
  if (!tab.tab)
166
- throw new Error("Tab missing \"tab\" name");
183
+ throw new Error('Tab missing "tab" name');
167
184
  const slug = tab.slug !== undefined ? tab.slug : slugify(tab.tab);
168
185
  if (slugs.has(slug))
169
186
  throw new Error(`Duplicate tab slug "${slug}" (from "${tab.tab}")`);
170
187
  slugs.add(slug);
171
- const sources = [tab.openapi, tab.groups, tab.doxygen, tab.mcp, tab.godoc].filter(Boolean).length;
188
+ const sources = [
189
+ tab.source,
190
+ tab.openapi,
191
+ tab.mkdocs,
192
+ tab.groups?.length ? tab.groups : undefined,
193
+ tab.doxygen,
194
+ tab.mcp,
195
+ tab.godoc,
196
+ tab.rustdoc,
197
+ ].filter(Boolean).length;
172
198
  if (sources > 1) {
173
- throw new Error(`Tab "${tab.tab}" has multiple sources; use only one of "openapi", "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"`);
174
200
  }
175
201
  if (sources === 0) {
176
- throw new Error(`Tab "${tab.tab}" needs one of "openapi", "groups", "doxygen", "mcp", or "godoc"`);
177
- }
178
- if (tab.openapi) {
179
- if (isUrl(tab.openapi)) {
180
- resolved.push({ label: tab.tab, slug, openapi: tab.openapi });
181
- }
182
- else {
183
- const absPath = resolve(configDir, tab.openapi);
184
- await assertExists(absPath, `OpenAPI spec "${tab.openapi}" in tab "${tab.tab}"`);
185
- resolved.push({ label: tab.tab, slug, openapi: absPath });
186
- }
187
- }
188
- else if (tab.mcp) {
189
- if (isUrl(tab.mcp)) {
190
- resolved.push({ label: tab.tab, slug, mcp: tab.mcp });
191
- }
192
- else {
193
- const absPath = resolve(configDir, tab.mcp);
194
- await assertExists(absPath, `MCP spec "${tab.mcp}" in tab "${tab.tab}"`);
195
- resolved.push({ label: tab.tab, slug, mcp: absPath });
196
- }
197
- }
198
- else if (tab.doxygen) {
199
- const absXml = resolve(configDir, tab.doxygen.xml);
200
- await assertExists(absXml, `Doxygen XML directory "${tab.doxygen.xml}" in tab "${tab.tab}"`);
201
- resolved.push({
202
- label: tab.tab,
203
- slug,
204
- doxygen: {
205
- xml: absXml,
206
- language: tab.doxygen.language ?? "cpp",
207
- groups: tab.doxygen.groups ?? false,
208
- index: tab.doxygen.index === false ? "none" : (tab.doxygen.index ?? "auto"),
209
- },
210
- });
211
- }
212
- else if (tab.godoc) {
213
- const cfg = typeof tab.godoc === "string" ? { module: tab.godoc } : tab.godoc;
214
- const moduleAbs = resolve(configDir, cfg.module ?? ".");
215
- await assertExists(moduleAbs, `Go module directory "${cfg.module ?? "."}" in tab "${tab.tab}"`);
216
- const snapshotAbs = cfg.snapshot ? resolve(configDir, cfg.snapshot) : undefined;
217
- resolved.push({
218
- label: tab.tab,
219
- slug,
220
- godoc: {
221
- module: moduleAbs,
222
- packages: cfg.packages?.length ? cfg.packages : ["./..."],
223
- snapshot: snapshotAbs,
224
- mode: cfg.mode ?? "auto",
225
- includeTests: cfg.includeTests ?? true,
226
- includeUnexported: cfg.includeUnexported ?? false,
227
- hideUndocumented: cfg.hideUndocumented ?? false,
228
- exclude: cfg.exclude ?? [],
229
- goEnv: cfg.goEnv,
230
- sourceBasePath: trimSlashes(cfg.sourceBasePath ?? ""),
231
- },
232
- });
233
- }
234
- else {
235
- const groups = await resolveGroups(tab.groups, tab.tab, configDir);
236
- resolved.push({ label: tab.tab, slug, groups });
202
+ throw new Error(`Tab "${tab.tab}" needs one of "source", "openapi", "mkdocs", "groups", "doxygen", "mcp", "godoc", or "rustdoc"`);
237
203
  }
204
+ const adapter = tab.source ?? legacySourceAdapter(tab);
205
+ const source = await adapter.resolve({
206
+ configDir,
207
+ tabName: tab.tab,
208
+ tabSlug: slug,
209
+ resolvePath: (path) => resolve(configDir, path),
210
+ assertExists,
211
+ isUrl,
212
+ });
213
+ resolved.push(resolvedTabFromSource(tab.tab, slug, source));
238
214
  }
239
215
  return resolved;
240
216
  }
241
- async function resolveGroups(groups, tabName, configDir) {
242
- const resolved = [];
243
- for (const group of groups) {
244
- if (!group.group)
245
- throw new Error(`Group missing "group" name in tab "${tabName}"`);
246
- if (!group.pages?.length)
247
- throw new Error(`Group "${group.group}" in tab "${tabName}" has no pages`);
248
- const pages = [];
249
- for (const pageSlug of group.pages) {
250
- if (pageSlug.includes("*")) {
251
- const expanded = await expandGlob(pageSlug, configDir);
252
- for (const file of expanded) {
253
- const rel = relative(configDir, file).replace(/\.[^.]+$/, "");
254
- pages.push({ slug: rel, file });
255
- }
256
- }
257
- else {
258
- const absPath = await resolvePagePath(pageSlug, configDir);
259
- pages.push({ slug: pageSlug, file: absPath });
260
- }
261
- }
262
- resolved.push({ label: group.group, pages });
263
- }
264
- return resolved;
217
+ function legacySourceAdapter(tab) {
218
+ if (tab.openapi)
219
+ return openapiSource(tab.openapi);
220
+ if (tab.mkdocs)
221
+ return mkdocsSource(tab.mkdocs);
222
+ if (tab.mcp)
223
+ return mcpSource(tab.mcp);
224
+ if (tab.doxygen)
225
+ return doxygenSource(tab.doxygen);
226
+ if (tab.godoc)
227
+ return godocSource(tab.godoc);
228
+ if (tab.rustdoc)
229
+ return rustdocSource(tab.rustdoc);
230
+ return markdownSource({ groups: tab.groups });
265
231
  }
266
- /**
267
- * Expand a simple glob pattern like "doc/api-*" into matching .md/.mdx files.
268
- * Supports trailing * only (e.g. "doc/api-*", "guides/*").
269
- */
270
- async function expandGlob(pattern, configDir) {
271
- const absPattern = resolve(configDir, pattern);
272
- const dir = dirname(absPattern);
273
- const prefix = basename(absPattern).replace("*", "");
274
- try {
275
- const entries = await readdir(dir);
276
- const matches = entries
277
- .filter((f) => {
278
- const ext = extname(f);
279
- if (ext !== ".md" && ext !== ".mdx")
280
- return false;
281
- const name = basename(f, ext);
282
- return prefix ? name.startsWith(prefix) : true;
283
- })
284
- .sort()
285
- .map((f) => resolve(dir, f));
286
- if (!matches.length) {
287
- throw new Error(`Glob "${pattern}" matched no files in ${dir}`);
288
- }
289
- return matches;
290
- }
291
- catch (err) {
292
- if (err.code === "ENOENT") {
293
- throw new Error(`Glob directory not found: ${dir}`);
294
- }
295
- throw err;
232
+ function resolvedTabFromSource(label, slug, source) {
233
+ const base = { label, slug, source };
234
+ switch (source.kind) {
235
+ case "openapi":
236
+ return { ...base, openapi: source.spec };
237
+ case "mcp":
238
+ return { ...base, mcp: source.spec };
239
+ case "markdown":
240
+ return {
241
+ ...base,
242
+ mkdocs: source.adapter === "mkdocs" ? source.configPath : undefined,
243
+ groups: source.groups,
244
+ };
245
+ case "doxygen":
246
+ return { ...base, doxygen: source.config };
247
+ case "godoc":
248
+ return { ...base, godoc: source.config };
249
+ case "rustdoc":
250
+ return { ...base, rustdoc: source.config };
296
251
  }
297
252
  }
298
- async function resolvePagePath(slug, configDir) {
299
- for (const ext of [".md", ".mdx"]) {
300
- const candidate = resolve(configDir, `${slug}${ext}`);
301
- try {
302
- await access(candidate);
303
- return candidate;
304
- }
305
- catch { /* try next */ }
306
- }
307
- throw new Error(`Page "${slug}" not found (tried ${slug}.md, ${slug}.mdx in ${configDir})`);
308
- }
309
253
  // ---------------------------------------------------------------------------
310
254
  // Utilities
311
255
  // ---------------------------------------------------------------------------
312
256
  export function slugify(name) {
313
- return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
257
+ return name
258
+ .toLowerCase()
259
+ .replace(/[^a-z0-9]+/g, "-")
260
+ .replace(/^-|-$/g, "");
314
261
  }
315
262
  /** Build a path under a tab, handling empty slugs (root-level tabs). */
316
263
  export function tabPath(tabSlug, file) {
@@ -350,16 +297,21 @@ function resolvePrettyUrls(value) {
350
297
  throw new Error(`Invalid prettyUrls "${String(value)}". Expected false, "slash", or "strip".`);
351
298
  }
352
299
  export function hexToRgb(hex) {
353
- const h = hex.replace("#", "");
354
- if (h.length !== 6)
300
+ const h = hex.replace(/^#/, "");
301
+ if (!/^[0-9a-fA-F]{6}$/.test(h))
355
302
  throw new Error(`Invalid hex color: "${hex}"`);
356
303
  const r = parseInt(h.slice(0, 2), 16);
357
304
  const g = parseInt(h.slice(2, 4), 16);
358
305
  const b = parseInt(h.slice(4, 6), 16);
359
306
  return `${r} ${g} ${b}`;
360
307
  }
361
- function trimSlashes(path) {
362
- return path.replace(/^\/+|\/+$/g, "");
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];
363
315
  }
364
316
  async function assertExists(filePath, label) {
365
317
  try {
@@ -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"}