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.
- package/README.md +24 -97
- package/dist/adapters/index.d.ts +12 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +130 -0
- package/dist/adapters/mkdocs.d.ts +5 -0
- package/dist/adapters/mkdocs.d.ts.map +1 -0
- package/dist/adapters/mkdocs.js +367 -0
- package/dist/adapters/shared.d.ts +12 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/shared.js +134 -0
- package/dist/adapters/types.d.ts +74 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +1 -0
- package/dist/cli.js +28 -34
- package/dist/client/search.js +213 -82
- package/dist/client/tabs.js +23 -0
- package/dist/components/layout/Head.js +17 -4
- package/dist/components/layout/TableOfContents.d.ts.map +1 -1
- package/dist/components/layout/TableOfContents.js +4 -2
- package/dist/components/openapi/Introduction.d.ts.map +1 -1
- package/dist/components/openapi/Introduction.js +16 -1
- package/dist/components/openapi/Security.d.ts.map +1 -1
- package/dist/components/openapi/Security.js +18 -2
- package/dist/config.d.ts +101 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +95 -143
- package/dist/core/api-rendering.d.ts +47 -0
- package/dist/core/api-rendering.d.ts.map +1 -0
- package/dist/core/api-rendering.js +76 -0
- package/dist/core/doxygen-loader.d.ts.map +1 -1
- package/dist/core/doxygen-loader.js +36 -17
- package/dist/core/godoc-loader.d.ts.map +1 -1
- package/dist/core/godoc-loader.js +17 -6
- package/dist/core/markdown-loader.d.ts +14 -0
- package/dist/core/markdown-loader.d.ts.map +1 -1
- package/dist/core/markdown-loader.js +70 -26
- package/dist/core/mcp-normalizer.d.ts.map +1 -1
- package/dist/core/mcp-normalizer.js +48 -34
- package/dist/core/navigation.d.ts.map +1 -1
- package/dist/core/navigation.js +8 -7
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +75 -4
- package/dist/core/rustdoc-introspector.d.ts +29 -0
- package/dist/core/rustdoc-introspector.d.ts.map +1 -0
- package/dist/core/rustdoc-introspector.js +236 -0
- package/dist/core/rustdoc-loader.d.ts +25 -0
- package/dist/core/rustdoc-loader.d.ts.map +1 -0
- package/dist/core/rustdoc-loader.js +469 -0
- package/dist/core/rustdoc-render.d.ts +76 -0
- package/dist/core/rustdoc-render.d.ts.map +1 -0
- package/dist/core/rustdoc-render.js +785 -0
- package/dist/core/rustdoc-types.d.ts +314 -0
- package/dist/core/rustdoc-types.d.ts.map +1 -0
- package/dist/core/rustdoc-types.js +18 -0
- package/dist/core/search-indexer.d.ts +10 -0
- package/dist/core/search-indexer.d.ts.map +1 -1
- package/dist/core/search-indexer.js +6 -1
- package/dist/core/sourcey-rustdoc/Cargo.lock +705 -0
- package/dist/core/sourcey-rustdoc/Cargo.toml +38 -0
- package/dist/core/sourcey-rustdoc/README.md +59 -0
- package/dist/core/sourcey-rustdoc/src/diagnostics.rs +42 -0
- package/dist/core/sourcey-rustdoc/src/doctest.rs +268 -0
- package/dist/core/sourcey-rustdoc/src/extract.rs +492 -0
- package/dist/core/sourcey-rustdoc/src/lib.rs +58 -0
- package/dist/core/sourcey-rustdoc/src/links.rs +126 -0
- package/dist/core/sourcey-rustdoc/src/main.rs +256 -0
- package/dist/core/sourcey-rustdoc/src/signature.rs +415 -0
- package/dist/core/sourcey-rustdoc/src/spec.rs +390 -0
- package/dist/core/sourcey-rustdoc/tests/format_version.rs +45 -0
- package/dist/dev-server.d.ts.map +1 -1
- package/dist/dev-server.js +109 -33
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -14
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +21 -16
- package/dist/renderer/changelog-feed.d.ts.map +1 -1
- package/dist/renderer/changelog-feed.js +27 -19
- package/dist/renderer/html-builder.d.ts.map +1 -1
- package/dist/renderer/html-builder.js +4 -3
- package/dist/renderer/llms.js +57 -2
- package/dist/site-assembly.d.ts +5 -0
- package/dist/site-assembly.d.ts.map +1 -1
- package/dist/site-assembly.js +161 -25
- package/dist/themes/default/sourcey.css +300 -0
- package/dist/utils/code-samples.d.ts +1 -0
- package/dist/utils/code-samples.d.ts.map +1 -1
- package/dist/utils/code-samples.js +30 -22
- package/dist/utils/html.d.ts +10 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +152 -0
- package/dist/utils/http.d.ts +0 -2
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +19 -34
- package/dist/utils/markdown.d.ts.map +1 -1
- package/dist/utils/markdown.js +115 -39
- package/dist/vite-plugin.d.ts +2 -0
- package/dist/vite-plugin.d.ts.map +1 -1
- package/dist/vite-plugin.js +71 -1
- 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;
|
|
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]) =>
|
|
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;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
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
|
|
2
|
-
import { resolve,
|
|
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: {
|
|
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: [
|
|
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:")
|
|
91
|
-
|
|
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
|
|
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(
|
|
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 = [
|
|
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 "
|
|
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 "
|
|
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
return
|
|
283
|
-
|
|
284
|
-
.
|
|
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
|
|
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
|
|
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
|
|
362
|
-
|
|
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"}
|