sourcey 3.4.11 → 3.5.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 +13 -12
- package/dist/cli.js +46 -4
- package/dist/components/changelog/ChangelogPage.d.ts +5 -0
- package/dist/components/changelog/ChangelogPage.d.ts.map +1 -0
- package/dist/components/changelog/ChangelogPage.js +8 -0
- package/dist/components/changelog/EntryList.d.ts +5 -0
- package/dist/components/changelog/EntryList.d.ts.map +1 -0
- package/dist/components/changelog/EntryList.js +6 -0
- package/dist/components/changelog/TypeBadge.d.ts +6 -0
- package/dist/components/changelog/TypeBadge.d.ts.map +1 -0
- package/dist/components/changelog/TypeBadge.js +14 -0
- package/dist/components/changelog/VersionCard.d.ts +6 -0
- package/dist/components/changelog/VersionCard.d.ts.map +1 -0
- package/dist/components/changelog/VersionCard.js +25 -0
- package/dist/components/layout/Head.d.ts.map +1 -1
- package/dist/components/layout/Head.js +15 -3
- package/dist/components/layout/Page.d.ts.map +1 -1
- package/dist/components/layout/Page.js +12 -6
- package/dist/components/openapi/Introduction.d.ts.map +1 -1
- package/dist/components/openapi/Introduction.js +1 -1
- package/dist/components/openapi/MediaTypeDetails.d.ts +11 -0
- package/dist/components/openapi/MediaTypeDetails.d.ts.map +1 -0
- package/dist/components/openapi/MediaTypeDetails.js +54 -0
- package/dist/components/openapi/Parameters.d.ts.map +1 -1
- package/dist/components/openapi/Parameters.js +6 -1
- package/dist/components/openapi/RequestBody.d.ts.map +1 -1
- package/dist/components/openapi/RequestBody.js +5 -1
- package/dist/components/openapi/Responses.d.ts.map +1 -1
- package/dist/components/openapi/Responses.js +1 -1
- package/dist/components/openapi/Security.d.ts.map +1 -1
- package/dist/components/openapi/Security.js +3 -2
- package/dist/components/openapi/Tags.d.ts.map +1 -1
- package/dist/components/openapi/Tags.js +8 -1
- package/dist/config.d.ts +50 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +50 -4
- package/dist/core/changelog-normalizer.d.ts +8 -0
- package/dist/core/changelog-normalizer.d.ts.map +1 -0
- package/dist/core/changelog-normalizer.js +531 -0
- package/dist/core/doxygen-loader.d.ts.map +1 -1
- package/dist/core/doxygen-loader.js +2 -0
- package/dist/core/loader.js +2 -0
- package/dist/core/markdown-loader.d.ts +21 -0
- package/dist/core/markdown-loader.d.ts.map +1 -1
- package/dist/core/markdown-loader.js +43 -25
- package/dist/core/mcp-normalizer.d.ts.map +1 -1
- package/dist/core/navigation.d.ts +4 -3
- package/dist/core/navigation.d.ts.map +1 -1
- package/dist/core/navigation.js +20 -6
- package/dist/core/normalizer.d.ts.map +1 -1
- package/dist/core/normalizer.js +102 -4
- package/dist/core/parser.d.ts +2 -2
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +23 -16
- package/dist/core/search-indexer.d.ts +3 -2
- package/dist/core/search-indexer.d.ts.map +1 -1
- package/dist/core/search-indexer.js +50 -17
- package/dist/core/tag-utils.d.ts +5 -0
- package/dist/core/tag-utils.d.ts.map +1 -0
- package/dist/core/tag-utils.js +22 -0
- package/dist/core/types.d.ts +82 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -1
- package/dist/dev-server.d.ts +2 -0
- package/dist/dev-server.d.ts.map +1 -1
- package/dist/dev-server.js +83 -212
- package/dist/index.d.ts +6 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -247
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +7 -3
- package/dist/og/fonts/Inter-Bold.ttf +0 -0
- package/dist/og/fonts/Inter-Regular.ttf +0 -0
- package/dist/og/generate-og-image.d.ts +10 -0
- package/dist/og/generate-og-image.d.ts.map +1 -0
- package/dist/og/generate-og-image.js +198 -0
- package/dist/renderer/changelog-feed.d.ts +18 -0
- package/dist/renderer/changelog-feed.d.ts.map +1 -0
- package/dist/renderer/changelog-feed.js +91 -0
- package/dist/renderer/context.d.ts +27 -7
- package/dist/renderer/context.d.ts.map +1 -1
- package/dist/renderer/html-builder.d.ts +10 -1
- package/dist/renderer/html-builder.d.ts.map +1 -1
- package/dist/renderer/html-builder.js +58 -5
- package/dist/renderer/llms.d.ts.map +1 -1
- package/dist/renderer/llms.js +133 -24
- package/dist/site-assembly.d.ts +25 -0
- package/dist/site-assembly.d.ts.map +1 -0
- package/dist/site-assembly.js +467 -0
- package/dist/site-url.d.ts +12 -0
- package/dist/site-url.d.ts.map +1 -0
- package/dist/site-url.js +67 -0
- package/dist/themes/default/sourcey.css +236 -0
- package/dist/utils/code-samples.d.ts.map +1 -1
- package/dist/utils/code-samples.js +53 -12
- package/dist/utils/markdown.d.ts +6 -0
- package/dist/utils/markdown.d.ts.map +1 -1
- package/dist/utils/markdown.js +11 -2
- package/dist/vite-plugin.d.ts +2 -0
- package/dist/vite-plugin.d.ts.map +1 -1
- package/dist/vite-plugin.js +6 -2
- package/package.json +6 -3
|
@@ -3,6 +3,7 @@ import { useContext } from "preact/hooks";
|
|
|
3
3
|
import { SpecContext } from "../../renderer/context.js";
|
|
4
4
|
import { SectionLabel } from "../ui/SectionLabel.js";
|
|
5
5
|
import { Markdown } from "../ui/Markdown.js";
|
|
6
|
+
import { DeprecatedBadge } from "../ui/Badge.js";
|
|
6
7
|
/**
|
|
7
8
|
* Per-operation security requirements.
|
|
8
9
|
*/
|
|
@@ -15,7 +16,7 @@ export function SecurityCopy({ security }) {
|
|
|
15
16
|
return null;
|
|
16
17
|
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]) => {
|
|
17
18
|
const scheme = spec.securitySchemes[name];
|
|
18
|
-
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?.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));
|
|
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));
|
|
19
20
|
}) }, i))) })] }));
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
@@ -26,5 +27,5 @@ export function SecurityDefinitions() {
|
|
|
26
27
|
const schemes = Object.entries(spec.securitySchemes);
|
|
27
28
|
if (!schemes.length)
|
|
28
29
|
return null;
|
|
29
|
-
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 }) })] }), _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.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?.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))) })] }));
|
|
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))) })] }));
|
|
30
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tags.d.ts","sourceRoot":"","sources":["../../../src/components/openapi/Tags.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"Tags.d.ts","sourceRoot":"","sources":["../../../src/components/openapi/Tags.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOzD,UAAU,SAAS;IACjB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,gCAkDlD"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "preact/jsx-runtime";
|
|
2
|
+
import { tagDisplayName, tagLineage } from "../../core/tag-utils.js";
|
|
2
3
|
import { htmlId } from "../../utils/html-id.js";
|
|
3
4
|
import { Markdown } from "../ui/Markdown.js";
|
|
5
|
+
import { Badge } from "../ui/Badge.js";
|
|
4
6
|
import { Operation } from "./Operation.js";
|
|
5
7
|
export function Tags({ tags, serverUrl }) {
|
|
8
|
+
const tagsByName = new Map(tags.map((tag) => [tag.name, tag]));
|
|
6
9
|
return (_jsx(_Fragment, { children: tags
|
|
7
10
|
.filter((t) => !t.hidden)
|
|
8
|
-
.map((tag) =>
|
|
11
|
+
.map((tag) => {
|
|
12
|
+
const parents = tagLineage(tag, tagsByName);
|
|
13
|
+
const displayName = tagDisplayName(tag);
|
|
14
|
+
return (_jsxs("div", { class: tag.parent ? "mt-8" : "mt-12", children: [_jsxs("div", { id: `tag-${htmlId(tag.name)}`, "data-traverse-target": `tag-${htmlId(tag.name)}`, class: "mb-6", children: [parents.length > 0 && (_jsx("div", { class: "mb-2 text-xs font-medium uppercase tracking-[0.12em] text-[rgb(var(--color-gray-500))]", children: parents.map(tagDisplayName).join(" / ") })), _jsxs("div", { class: "mb-2 flex flex-wrap items-center gap-2", children: [_jsx("h1", { class: "text-xl font-bold text-[rgb(var(--color-gray-900))] dark:text-[rgb(var(--color-gray-200))]", children: displayName }), tag.summary && tag.summary !== tag.name && (_jsx(Badge, { children: _jsx("code", { children: tag.name }) })), tag.kind && _jsx(Badge, { children: tag.kind })] }), tag.description && (_jsx(Markdown, { content: tag.description, class: "text-sm max-w-none" }))] }), tag.operations.map((op) => (_jsx(Operation, { operation: op, serverUrl: serverUrl }, `${op.method}-${op.path}`)))] }, tag.name));
|
|
15
|
+
}) }));
|
|
9
16
|
}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { PrettyUrls } from "./site-url.js";
|
|
2
|
+
export type { PrettyUrls } from "./site-url.js";
|
|
1
3
|
export type ThemePreset = "default" | "minimal" | "api-first";
|
|
2
4
|
export interface ThemeConfig {
|
|
3
5
|
preset?: ThemePreset;
|
|
@@ -17,8 +19,32 @@ export interface ThemeConfig {
|
|
|
17
19
|
};
|
|
18
20
|
css?: string[];
|
|
19
21
|
}
|
|
22
|
+
export interface ChangelogConfig {
|
|
23
|
+
/** Disable changelog auto-detection for CHANGELOG.md and layout: changelog pages. */
|
|
24
|
+
enabled?: boolean;
|
|
25
|
+
/** Generate Atom and RSS feeds for changelog pages. */
|
|
26
|
+
feed?: boolean | {
|
|
27
|
+
title?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
};
|
|
30
|
+
/** Generate standalone per-version changelog pages. */
|
|
31
|
+
permalinks?: boolean;
|
|
32
|
+
/** Generate dedicated OG images for per-version changelog pages. */
|
|
33
|
+
ogImages?: boolean;
|
|
34
|
+
}
|
|
20
35
|
export interface SourceyConfig {
|
|
21
36
|
name?: string;
|
|
37
|
+
/** Public site origin for absolute feeds, OG metadata, and canonical URLs (e.g. "https://docs.example.com"). */
|
|
38
|
+
siteUrl?: string;
|
|
39
|
+
/** Public path prefix when the docs are served from a subpath (e.g. "/reference"). */
|
|
40
|
+
baseUrl?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Clean URLs without `.html` extensions.
|
|
43
|
+
* - `"slash"`: emit `foo/index.html` and link as `/foo/`.
|
|
44
|
+
* - `"strip"`: same layout but link as `/foo` and emit a `_redirects` file for stale variants.
|
|
45
|
+
* - `false` (default): keep `.html` extensions.
|
|
46
|
+
*/
|
|
47
|
+
prettyUrls?: PrettyUrls;
|
|
22
48
|
theme?: ThemeConfig;
|
|
23
49
|
logo?: string | {
|
|
24
50
|
light: string;
|
|
@@ -26,6 +52,8 @@ export interface SourceyConfig {
|
|
|
26
52
|
href?: string;
|
|
27
53
|
};
|
|
28
54
|
favicon?: string;
|
|
55
|
+
/** Static OG image URL or local path. When set, skips automatic per-page OG image generation. */
|
|
56
|
+
ogImage?: string;
|
|
29
57
|
/** GitHub repo URL (e.g. "https://github.com/user/repo"). */
|
|
30
58
|
repo?: string;
|
|
31
59
|
/** Branch name for "Edit this page" links (e.g. "main", "master"). When set, enables edit links on markdown pages. */
|
|
@@ -52,6 +80,7 @@ export interface SourceyConfig {
|
|
|
52
80
|
footer?: {
|
|
53
81
|
links?: NavbarLink[];
|
|
54
82
|
};
|
|
83
|
+
changelog?: false | ChangelogConfig;
|
|
55
84
|
/** Search configuration. */
|
|
56
85
|
search?: {
|
|
57
86
|
/** Page slugs to feature at the top of search results when no query is entered. */
|
|
@@ -116,8 +145,20 @@ export interface ResolvedTheme {
|
|
|
116
145
|
};
|
|
117
146
|
css: string[];
|
|
118
147
|
}
|
|
148
|
+
export interface ResolvedChangelogConfig {
|
|
149
|
+
enabled: boolean;
|
|
150
|
+
feed: false | {
|
|
151
|
+
title?: string;
|
|
152
|
+
description?: string;
|
|
153
|
+
};
|
|
154
|
+
permalinks: boolean;
|
|
155
|
+
ogImages: boolean;
|
|
156
|
+
}
|
|
119
157
|
export interface ResolvedConfig {
|
|
120
158
|
name: string;
|
|
159
|
+
siteUrl?: string;
|
|
160
|
+
baseUrl: string;
|
|
161
|
+
prettyUrls: PrettyUrls;
|
|
121
162
|
theme: ResolvedTheme;
|
|
122
163
|
logo?: {
|
|
123
164
|
light?: string;
|
|
@@ -125,6 +166,7 @@ export interface ResolvedConfig {
|
|
|
125
166
|
href?: string;
|
|
126
167
|
};
|
|
127
168
|
favicon?: string;
|
|
169
|
+
ogImage?: string;
|
|
128
170
|
repo?: string;
|
|
129
171
|
editBranch?: string;
|
|
130
172
|
editBasePath?: string;
|
|
@@ -141,6 +183,7 @@ export interface ResolvedConfig {
|
|
|
141
183
|
footer: {
|
|
142
184
|
links: NavbarLink[];
|
|
143
185
|
};
|
|
186
|
+
changelog: ResolvedChangelogConfig;
|
|
144
187
|
search: {
|
|
145
188
|
featured: string[];
|
|
146
189
|
};
|
|
@@ -169,7 +212,7 @@ export interface ResolvedGroup {
|
|
|
169
212
|
label: string;
|
|
170
213
|
pages: ResolvedPage[];
|
|
171
214
|
}
|
|
172
|
-
export declare function loadConfig(
|
|
215
|
+
export declare function loadConfig(configOrDir?: string): Promise<ResolvedConfig>;
|
|
173
216
|
/**
|
|
174
217
|
* Build a ResolvedConfig for a standalone spec file (no config file needed).
|
|
175
218
|
*/
|
|
@@ -178,5 +221,11 @@ export declare function resolveConfigFromRaw(raw: SourceyConfig, configDir: stri
|
|
|
178
221
|
export declare function slugify(name: string): string;
|
|
179
222
|
/** Build a path under a tab, handling empty slugs (root-level tabs). */
|
|
180
223
|
export declare function tabPath(tabSlug: string, file: string): string;
|
|
224
|
+
/**
|
|
225
|
+
* Build the on-disk output path for a content page within a tab.
|
|
226
|
+
* When `prettyUrls` is enabled, the page is emitted as `slug/index.html` so hosts
|
|
227
|
+
* serve it at `/slug/` (or `/slug` with rewrites). Otherwise it's emitted as `slug.html`.
|
|
228
|
+
*/
|
|
229
|
+
export declare function pageOutputPath(tabSlug: string, slug: string, prettyUrls: PrettyUrls): string;
|
|
181
230
|
export declare function hexToRgb(hex: string): string;
|
|
182
231
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { access, readdir } from "node:fs/promises";
|
|
2
2
|
import { resolve, relative, dirname, basename, extname } from "node:path";
|
|
3
3
|
import { createJiti } from "jiti";
|
|
4
|
+
import { normalizeBaseUrl, normalizeSiteUrl } from "./site-url.js";
|
|
4
5
|
export function defineConfig(config) {
|
|
5
6
|
return config;
|
|
6
7
|
}
|
|
@@ -20,14 +21,20 @@ const DEFAULT_LAYOUT = {
|
|
|
20
21
|
toc: "19rem",
|
|
21
22
|
content: "44rem",
|
|
22
23
|
};
|
|
23
|
-
export async function loadConfig(
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
export async function loadConfig(configOrDir) {
|
|
25
|
+
let configPath;
|
|
26
|
+
if (configOrDir && configOrDir.endsWith(".ts")) {
|
|
27
|
+
configPath = resolve(configOrDir);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const dir = configOrDir ?? process.cwd();
|
|
31
|
+
configPath = resolve(dir, "sourcey.config.ts");
|
|
32
|
+
}
|
|
26
33
|
try {
|
|
27
34
|
await access(configPath);
|
|
28
35
|
}
|
|
29
36
|
catch {
|
|
30
|
-
throw new Error(`
|
|
37
|
+
throw new Error(`Config not found: ${configPath}\n` +
|
|
31
38
|
`Create one with:\n\n` +
|
|
32
39
|
` import { defineConfig } from "sourcey";\n` +
|
|
33
40
|
` export default defineConfig({ navigation: { tabs: [...] } });\n`);
|
|
@@ -47,6 +54,9 @@ export function configFromSpec(specPath) {
|
|
|
47
54
|
const absSpec = resolve(specPath);
|
|
48
55
|
return {
|
|
49
56
|
name: "API Reference",
|
|
57
|
+
siteUrl: undefined,
|
|
58
|
+
baseUrl: "",
|
|
59
|
+
prettyUrls: false,
|
|
50
60
|
theme: {
|
|
51
61
|
preset: "default",
|
|
52
62
|
colors: { ...DEFAULT_COLORS },
|
|
@@ -58,6 +68,7 @@ export function configFromSpec(specPath) {
|
|
|
58
68
|
tabs: [{ label: "API Reference", slug: "api", openapi: absSpec }],
|
|
59
69
|
navbar: { links: [] },
|
|
60
70
|
footer: { links: [] },
|
|
71
|
+
changelog: { enabled: true, feed: false, permalinks: false, ogImages: false },
|
|
61
72
|
search: { featured: [] },
|
|
62
73
|
};
|
|
63
74
|
}
|
|
@@ -68,11 +79,16 @@ export async function resolveConfigFromRaw(raw, configDir) {
|
|
|
68
79
|
const theme = resolveTheme(raw, configDir);
|
|
69
80
|
const logo = resolveLogo(raw.logo, configDir);
|
|
70
81
|
const tabs = await resolveTabs(raw.navigation.tabs, configDir);
|
|
82
|
+
const changelog = resolveChangelog(raw.changelog);
|
|
71
83
|
return {
|
|
72
84
|
name: raw.name ?? "",
|
|
85
|
+
siteUrl: normalizeSiteUrl(raw.siteUrl),
|
|
86
|
+
baseUrl: normalizeBaseUrl(raw.baseUrl),
|
|
87
|
+
prettyUrls: resolvePrettyUrls(raw.prettyUrls),
|
|
73
88
|
theme,
|
|
74
89
|
logo,
|
|
75
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,
|
|
76
92
|
repo: raw.repo,
|
|
77
93
|
editBranch: raw.editBranch,
|
|
78
94
|
editBasePath: raw.editBasePath,
|
|
@@ -85,6 +101,7 @@ export async function resolveConfigFromRaw(raw, configDir) {
|
|
|
85
101
|
footer: {
|
|
86
102
|
links: raw.footer?.links ?? [],
|
|
87
103
|
},
|
|
104
|
+
changelog,
|
|
88
105
|
search: {
|
|
89
106
|
featured: raw.search?.featured ?? [],
|
|
90
107
|
},
|
|
@@ -130,6 +147,17 @@ function resolveLogo(logo, configDir) {
|
|
|
130
147
|
return { light: resolvePath(logo) };
|
|
131
148
|
return { light: resolvePath(logo.light), dark: resolvePath(logo.dark), href: logo.href };
|
|
132
149
|
}
|
|
150
|
+
function resolveChangelog(raw) {
|
|
151
|
+
if (raw === false) {
|
|
152
|
+
return { enabled: false, feed: false, permalinks: false, ogImages: false };
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
enabled: raw?.enabled ?? true,
|
|
156
|
+
feed: raw?.feed === true ? {} : (raw?.feed ?? false),
|
|
157
|
+
permalinks: raw?.permalinks ?? false,
|
|
158
|
+
ogImages: raw?.ogImages ?? false,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
133
161
|
async function resolveTabs(tabs, configDir) {
|
|
134
162
|
const slugs = new Set();
|
|
135
163
|
const resolved = [];
|
|
@@ -270,6 +298,24 @@ export function tabPath(tabSlug, file) {
|
|
|
270
298
|
return file;
|
|
271
299
|
return `${tabSlug}/${file}`;
|
|
272
300
|
}
|
|
301
|
+
/**
|
|
302
|
+
* Build the on-disk output path for a content page within a tab.
|
|
303
|
+
* When `prettyUrls` is enabled, the page is emitted as `slug/index.html` so hosts
|
|
304
|
+
* serve it at `/slug/` (or `/slug` with rewrites). Otherwise it's emitted as `slug.html`.
|
|
305
|
+
*/
|
|
306
|
+
export function pageOutputPath(tabSlug, slug, prettyUrls) {
|
|
307
|
+
if (prettyUrls) {
|
|
308
|
+
return tabPath(tabSlug, `${slug}/index.html`);
|
|
309
|
+
}
|
|
310
|
+
return tabPath(tabSlug, `${slug}.html`);
|
|
311
|
+
}
|
|
312
|
+
function resolvePrettyUrls(value) {
|
|
313
|
+
if (value === undefined || value === false)
|
|
314
|
+
return false;
|
|
315
|
+
if (value === "slash" || value === "strip")
|
|
316
|
+
return value;
|
|
317
|
+
throw new Error(`Invalid prettyUrls "${String(value)}". Expected false, "slash", or "strip".`);
|
|
318
|
+
}
|
|
273
319
|
export function hexToRgb(hex) {
|
|
274
320
|
const h = hex.replace("#", "");
|
|
275
321
|
if (h.length !== 6)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NormalizedChangelog } from "./types.js";
|
|
2
|
+
export interface NormalizeChangelogOptions {
|
|
3
|
+
title?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
repoUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function normalizeChangelog(markdown: string, options?: NormalizeChangelogOptions): NormalizedChangelog;
|
|
8
|
+
//# sourceMappingURL=changelog-normalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog-normalizer.d.ts","sourceRoot":"","sources":["../../src/core/changelog-normalizer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAMV,mBAAmB,EAIpB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAuDD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,yBAA8B,GACtC,mBAAmB,CA4HrB"}
|