livemark 0.0.0-dev → 0.7.0
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 +5 -1
- package/build/actions/changelog/build.d.ts +14 -0
- package/build/actions/changelog/build.js +158 -0
- package/build/actions/changelog/build.unit.d.ts +1 -0
- package/build/actions/changelog/build.unit.js +66 -0
- package/build/actions/config/define.unit.js +11 -16
- package/build/actions/config/load.js +6 -3
- package/build/actions/config/load.unit.js +3 -3
- package/build/commands/build.js +4 -3
- package/build/commands/escape.d.ts +9 -0
- package/build/commands/escape.js +56 -0
- package/build/docs/markdown/includes/example.d.ts +53 -4
- package/build/docs/markdown/includes/example.js +2 -2
- package/build/livemark.config.d.ts +53 -4
- package/build/livemark.config.js +22 -2
- package/build/models/config.d.ts +315 -8
- package/build/models/config.js +25 -5
- package/build/models/link.d.ts +13 -0
- package/build/models/link.js +9 -0
- package/build/models/patch.d.ts +21 -0
- package/build/models/patch.js +7 -0
- package/build/models/section.d.ts +75 -0
- package/build/models/section.js +26 -0
- package/build/models/theme.d.ts +72 -0
- package/build/models/theme.js +73 -0
- package/build/program.js +4 -2
- package/build/vite.config.d.ts +1 -1
- package/build/website/assets/logo.svg +117 -0
- package/build/website/components/Article.tsx +172 -0
- package/build/website/components/BackToTop.tsx +32 -0
- package/build/website/components/Banner.tsx +2 -2
- package/build/website/components/BlogIndex.tsx +121 -0
- package/build/website/components/BlogSidebar.tsx +162 -0
- package/build/website/components/Breadcrumbs.tsx +5 -2
- package/build/website/components/Card.tsx +48 -0
- package/build/website/components/Cards.tsx +0 -58
- package/build/website/components/ChangelogIndex.tsx +111 -0
- package/build/website/components/ChangelogSidebar.tsx +120 -0
- package/build/website/components/CodeBlock.tsx +57 -40
- package/build/website/components/Column.tsx +4 -0
- package/build/website/components/Columns.tsx +0 -5
- package/build/website/components/Footer.tsx +12 -5
- package/build/website/components/InlineIcon.tsx +2 -13
- package/build/website/components/Layout.tsx +155 -185
- package/build/website/components/Mermaid.tsx +14 -33
- package/build/website/components/MermaidRenderer.tsx +37 -0
- package/build/website/components/MiniSidebar.tsx +49 -0
- package/build/website/components/PageToolbar.tsx +21 -11
- package/build/website/components/PrevNext.tsx +20 -12
- package/build/website/components/Search.tsx +28 -0
- package/build/website/components/SearchDialog.tsx +10 -10
- package/build/website/components/Sidebar.tsx +160 -0
- package/build/website/components/SidebarLinks.tsx +70 -0
- package/build/website/components/SidebarSections.tsx +71 -0
- package/build/website/components/SiteTitle.tsx +13 -8
- package/build/website/components/TagIndex.tsx +120 -0
- package/build/website/components/Theme.tsx +0 -1
- package/build/website/components/Toc.tsx +128 -1
- package/build/website/components/ZoomImage.tsx +15 -20
- package/build/website/content/article.ts +78 -0
- package/build/website/content/tag.ts +29 -0
- package/build/website/content-collections.ts +53 -26
- package/build/website/elements/sidebar.tsx +4 -4
- package/build/website/env.d.ts +4 -0
- package/build/website/helpers/article-icon.ts +2 -0
- package/build/website/helpers/article.ts +90 -0
- package/build/website/helpers/changelog-source.ts +16 -0
- package/build/website/helpers/changelog-source.unit.ts +38 -0
- package/build/website/helpers/dynamic-icon-resolver.tsx +19 -0
- package/build/website/helpers/dynamic-icon.tsx +12 -0
- package/build/website/helpers/favicon.ts +7 -0
- package/build/website/helpers/model.ts +4 -0
- package/build/website/helpers/resolve-asset-path.ts +9 -0
- package/build/website/helpers/section.ts +50 -0
- package/build/website/helpers/section.unit.ts +71 -0
- package/build/website/helpers/toc-context.ts +1 -1
- package/build/website/helpers/toc.ts +1 -6
- package/build/website/models/article.ts +48 -33
- package/build/website/models/toc.ts +5 -0
- package/build/website/plugins/rehype-task-list-a11y.ts +33 -0
- package/build/website/plugins/remark-ansi.ts +1 -0
- package/build/website/plugins/remark-image.ts +22 -13
- package/build/website/plugins/vite-livemark.ts +91 -0
- package/build/website/routeTree.gen.ts +9 -9
- package/build/website/routes/$.tsx +74 -131
- package/build/website/routes/__root.tsx +36 -23
- package/build/website/styles/general.css +26 -210
- package/build/website/styles/markdown.css +214 -0
- package/build/website/vite.config.ts +38 -3
- package/package.json +25 -16
- package/build/website/globals.d.ts +0 -8
- package/build/website/helpers/articles.ts +0 -24
- package/build/website/public/logo.svg +0 -72
- package/build/website/routes/index.tsx +0 -13
package/README.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
# Livemark
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/datisthq/livemark/actions)
|
|
4
|
+
[](https://codecov.io/gh/datisthq/livemark)
|
|
5
|
+
[](https://www.npmjs.com/package/livemark)
|
|
6
|
+
|
|
7
|
+
Livemark turns your .md files into a fast, modern documentation site — with Shiki, Mermaid, LaTeX, MDX components, blog and changelog sections, all built in. For more information, please read the [project's documentation](https://livemark.dev).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Config } from "../../models/config.ts";
|
|
2
|
+
import type { ChangelogSection } from "../../models/section.ts";
|
|
3
|
+
interface ChangelogEntry {
|
|
4
|
+
slug: string;
|
|
5
|
+
title: string;
|
|
6
|
+
date?: string;
|
|
7
|
+
body: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function cacheIncludeGlob(): string;
|
|
10
|
+
/** Build the per-version changelog cache files for a changelog section */
|
|
11
|
+
export declare function buildChangelog(section: ChangelogSection, config: Config): Promise<void>;
|
|
12
|
+
/** Parse CHANGELOG.md into per-version entries using mdast */
|
|
13
|
+
export declare function splitLocalChangelog(body: string): ChangelogEntry[];
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { access, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import slugify from "@sindresorhus/slugify";
|
|
4
|
+
import { toString as mdastToString } from "mdast-util-to-string";
|
|
5
|
+
import remarkParse from "remark-parse";
|
|
6
|
+
import remarkStringify from "remark-stringify";
|
|
7
|
+
import { unified } from "unified";
|
|
8
|
+
import { visit } from "unist-util-visit";
|
|
9
|
+
import { isGitHubUrl, parseGitHubRepo, } from "../../website/helpers/changelog-source.js";
|
|
10
|
+
const CACHE_DIR = ".livemark/cache/changelog";
|
|
11
|
+
const META_FILE = ".livemark/cache/changelog.meta.json";
|
|
12
|
+
const parser = unified().use(remarkParse);
|
|
13
|
+
const stringifier = unified().use(remarkStringify, {
|
|
14
|
+
bullet: "-",
|
|
15
|
+
fences: true,
|
|
16
|
+
emphasis: "_",
|
|
17
|
+
});
|
|
18
|
+
export function cacheIncludeGlob() {
|
|
19
|
+
return `${CACHE_DIR}/**/*.md`;
|
|
20
|
+
}
|
|
21
|
+
/** Build the per-version changelog cache files for a changelog section */
|
|
22
|
+
export async function buildChangelog(section, config) {
|
|
23
|
+
const cacheDir = join(config.root, CACHE_DIR);
|
|
24
|
+
const metaPath = join(config.root, META_FILE);
|
|
25
|
+
const entries = isGitHubUrl(section.source)
|
|
26
|
+
? await buildFromGitHub(section.source, metaPath, cacheDir)
|
|
27
|
+
: await buildFromLocal(section.source, config.root);
|
|
28
|
+
if (entries === undefined)
|
|
29
|
+
return;
|
|
30
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
31
|
+
await mkdir(cacheDir, { recursive: true });
|
|
32
|
+
for (const entry of entries) {
|
|
33
|
+
const markdown = wrapFrontmatter(entry, section);
|
|
34
|
+
await writeFile(join(cacheDir, `${entry.slug}.md`), markdown, "utf-8");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function buildFromLocal(source, root) {
|
|
38
|
+
const filePath = resolve(root, source);
|
|
39
|
+
const body = await readFile(filePath, "utf-8");
|
|
40
|
+
return splitLocalChangelog(body);
|
|
41
|
+
}
|
|
42
|
+
/** Parse CHANGELOG.md into per-version entries using mdast */
|
|
43
|
+
export function splitLocalChangelog(body) {
|
|
44
|
+
const tree = parser.parse(body);
|
|
45
|
+
const entries = [];
|
|
46
|
+
let current;
|
|
47
|
+
for (const child of tree.children) {
|
|
48
|
+
if (child.type === "heading" && child.depth === 2) {
|
|
49
|
+
if (current)
|
|
50
|
+
entries.push(finalizeEntry(current));
|
|
51
|
+
current = { heading: mdastToString(child), children: [] };
|
|
52
|
+
}
|
|
53
|
+
else if (current) {
|
|
54
|
+
current.children.push(child);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (current)
|
|
58
|
+
entries.push(finalizeEntry(current));
|
|
59
|
+
return entries;
|
|
60
|
+
}
|
|
61
|
+
function finalizeEntry(input) {
|
|
62
|
+
const versionMatch = input.heading.match(/^\[?([^\]\s]+)\]?/);
|
|
63
|
+
const version = versionMatch?.[1] ?? input.heading;
|
|
64
|
+
const dateMatch = input.heading.match(/\d{4}-\d{2}-\d{2}/);
|
|
65
|
+
const body = renderEntryBody(input.children);
|
|
66
|
+
return {
|
|
67
|
+
slug: slugify(version),
|
|
68
|
+
title: version,
|
|
69
|
+
date: dateMatch?.[0],
|
|
70
|
+
body,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** Serialize an entry's mdast children back to markdown */
|
|
74
|
+
function renderEntryBody(children) {
|
|
75
|
+
const root = { type: "root", children };
|
|
76
|
+
return stringifier.stringify(root).trimEnd();
|
|
77
|
+
}
|
|
78
|
+
/** Shift h2–h6 up by one so the version becomes the article's h1 */
|
|
79
|
+
function promoteHeadings(body) {
|
|
80
|
+
const tree = parser.parse(body);
|
|
81
|
+
visit(tree, "heading", node => {
|
|
82
|
+
if (node.depth > 1)
|
|
83
|
+
node.depth = (node.depth - 1);
|
|
84
|
+
});
|
|
85
|
+
return stringifier.stringify(tree).trimEnd();
|
|
86
|
+
}
|
|
87
|
+
async function buildFromGitHub(source, metaPath, cacheDir) {
|
|
88
|
+
const parsed = parseGitHubRepo(source);
|
|
89
|
+
if (!parsed) {
|
|
90
|
+
throw new Error(`Could not parse GitHub repo from source: ${source}`);
|
|
91
|
+
}
|
|
92
|
+
const url = `https://api.github.com/repos/${parsed.owner}/${parsed.repo}/releases?per_page=100`;
|
|
93
|
+
const headers = {
|
|
94
|
+
Accept: "application/vnd.github+json",
|
|
95
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
96
|
+
};
|
|
97
|
+
const token = process.env.GITHUB_TOKEN;
|
|
98
|
+
if (token)
|
|
99
|
+
headers.Authorization = `Bearer ${token}`;
|
|
100
|
+
const meta = await readMeta(metaPath);
|
|
101
|
+
const hasCache = await exists(cacheDir);
|
|
102
|
+
if (meta && hasCache)
|
|
103
|
+
headers["If-None-Match"] = meta.etag;
|
|
104
|
+
const res = await fetch(url, { headers });
|
|
105
|
+
if (res.status === 304)
|
|
106
|
+
return undefined;
|
|
107
|
+
if (!res.ok) {
|
|
108
|
+
const remaining = res.headers.get("x-ratelimit-remaining");
|
|
109
|
+
const reset = res.headers.get("x-ratelimit-reset");
|
|
110
|
+
const msg = `GitHub API ${res.status} ${res.statusText} (rate-limit remaining: ${remaining ?? "?"}, reset: ${reset ?? "?"})`;
|
|
111
|
+
if (hasCache) {
|
|
112
|
+
console.warn(`${msg} — falling back to cached changelog`);
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
throw new Error(msg);
|
|
116
|
+
}
|
|
117
|
+
const releases = (await res.json());
|
|
118
|
+
const etag = res.headers.get("etag");
|
|
119
|
+
if (etag) {
|
|
120
|
+
await writeFile(metaPath, JSON.stringify({ etag, fetchedAt: new Date().toISOString() }, null, 2), "utf-8");
|
|
121
|
+
}
|
|
122
|
+
return releases.map(release => ({
|
|
123
|
+
slug: slugify(release.tag_name),
|
|
124
|
+
title: release.tag_name,
|
|
125
|
+
date: release.published_at?.slice(0, 10),
|
|
126
|
+
body: (release.body ?? "").trim(),
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
function wrapFrontmatter(entry, section) {
|
|
130
|
+
const lines = [
|
|
131
|
+
"---",
|
|
132
|
+
`title: ${entry.title}`,
|
|
133
|
+
`path: ${section.prefix}${entry.slug}/`,
|
|
134
|
+
];
|
|
135
|
+
if (entry.date)
|
|
136
|
+
lines.push(`date: ${entry.date}`);
|
|
137
|
+
lines.push("---", "", `# ${entry.title}`, "", promoteHeadings(entry.body));
|
|
138
|
+
return lines.join("\n");
|
|
139
|
+
}
|
|
140
|
+
async function readMeta(metaPath) {
|
|
141
|
+
try {
|
|
142
|
+
const raw = await readFile(metaPath, "utf-8");
|
|
143
|
+
return JSON.parse(raw);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function exists(path) {
|
|
150
|
+
try {
|
|
151
|
+
await access(path);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hY3Rpb25zL2NoYW5nZWxvZy9idWlsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3pDLE9BQU8sT0FBTyxNQUFNLHVCQUF1QixDQUFBO0FBRTNDLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDaEUsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFBO0FBQ3RDLE9BQU8sZUFBZSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBR3hDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsZUFBZSxHQUNoQixNQUFNLDJDQUEyQyxDQUFBO0FBcUJsRCxNQUFNLFNBQVMsR0FBRywyQkFBMkIsQ0FBQTtBQUM3QyxNQUFNLFNBQVMsR0FBRyxxQ0FBcUMsQ0FBQTtBQUV2RCxNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRTtJQUNqRCxNQUFNLEVBQUUsR0FBRztJQUNYLE1BQU0sRUFBRSxJQUFJO0lBQ1osUUFBUSxFQUFFLEdBQUc7Q0FDZCxDQUFDLENBQUE7QUFFRixNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE9BQU8sR0FBRyxTQUFTLFVBQVUsQ0FBQTtBQUMvQixDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxLQUFLLFVB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LE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHO0tBQ3hDLENBQUE7SUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ2pELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzFFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN6QixDQUFDO0FBRUQsS0FBSyxVQUFVLFFBQVEsQ0FBQyxRQUFnQjtJQUN0QyxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBYyxDQUFBO0lBQ3JDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxNQUFNLENBQUMsSUFBWTtJQUNoQyxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNsQixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWNjZXNzLCBta2RpciwgcmVhZEZpbGUsIHJtLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgc2x1Z2lmeSBmcm9tIFwiQHNpbmRyZXNvcmh1cy9zbHVnaWZ5XCJcbmltcG9ydCB0eXBlIHsgUm9vdCwgUm9vdENvbnRlbnQgfSBmcm9tIFwibWRhc3RcIlxuaW1wb3J0IHsgdG9TdHJpbmcgYXMgbWRhc3RUb1N0cmluZyB9IGZyb20gXCJtZGFzdC11dGlsLXRvLXN0cmluZ1wiXG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSBcInJlbWFyay1wYXJzZVwiXG5pbXBvcnQgcmVtYXJrU3RyaW5naWZ5IGZyb20gXCJyZW1hcmstc3RyaW5naWZ5XCJcbmltcG9ydCB7IHVuaWZpZWQgfSBmcm9tIFwidW5pZmllZFwiXG5pbXBvcnQgeyB2aXNpdCB9IGZyb20gXCJ1bmlzdC11dGlsLXZpc2l0XCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHR5cGUgeyBDaGFuZ2Vsb2dTZWN0aW9uIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zZWN0aW9uLnRzXCJcbmltcG9ydCB7XG4gIGlzR2l0SHViVXJsLFxuICBwYXJzZUdpdEh1YlJlcG8sXG59IGZyb20gXCIuLi8uLi93ZWJzaXRlL2hlbHBlcnMvY2hhbmdlbG9nLXNvdXJjZS50c1wiXG5cbmludGVyZmFjZSBSZWxlYXNlIHtcbiAgdGFnX25hbWU6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbFxuICBwdWJsaXNoZWRfYXQ/OiBzdHJpbmcgfCBudWxsXG4gIGJvZHk/OiBzdHJpbmcgfCBudWxsXG59XG5cbmludGVyZmFjZSBDYWNoZU1ldGEge1xuICBldGFnOiBzdHJpbmdcbiAgZmV0Y2hlZEF0OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIENoYW5nZWxvZ0VudHJ5IHtcbiAgc2x1Zzogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbiAgZGF0ZT86IHN0cmluZ1xuICBib2R5OiBzdHJpbmdcbn1cblxuY29uc3QgQ0FDSEVfRElSID0gXCIubGl2ZW1hcmsvY2FjaGUvY2hhbmdlbG9nXCJcbmNvbnN0IE1FVEFfRklMRSA9IFwiLmxpdmVtYXJrL2NhY2hlL2NoYW5nZWxvZy5tZXRhLmpzb25cIlxuXG5jb25zdCBwYXJzZXIgPSB1bmlmaWVkKCkudXNlKHJlbWFya1BhcnNlKVxuY29uc3Qgc3RyaW5naWZpZXIgPSB1bmlmaWVkKCkudXNlKHJlbWFya1N0cmluZ2lmeSwge1xuICBidWxsZXQ6IFwiLVwiLFxuICBmZW5jZXM6IHRydWUsXG4gIGVtcGhhc2lzOiBcIl9cIixcbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUluY2x1ZGVHbG9iKCkge1xuICByZXR1cm4gYCR7Q0FDSEVfRElSfS8qKi8qLm1kYFxufVxuXG4vKiogQnVpbGQgdGhlIHBlci12ZXJzaW9uIGNoYW5nZWxvZyBjYWNoZSBmaWxlcyBmb3IgYSBjaGFuZ2Vsb2cgc2VjdGlvbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2hhbmdlbG9nKFxuICBzZWN0aW9uOiBDaGFuZ2Vsb2dTZWN0aW9uLFxuICBjb25maWc6IENvbmZpZyxcbikge1xuICBjb25zdCBjYWNoZURpciA9IGpvaW4oY29uZmlnLnJvb3QsIENBQ0hFX0RJUilcbiAgY29uc3QgbWV0YVBhdGggPSBqb2luKGNvbmZpZy5yb290LCBNRVRBX0ZJTEUpXG5cbiAgY29uc3QgZW50cmllcyA9IGlzR2l0SHViVXJsKHNlY3Rpb24uc291cmNlKVxuICAgID8gYXdhaXQgYnVpbGRGcm9tR2l0SHViKHNlY3Rpb24uc291cmNlLCBtZXRhUGF0aCwgY2FjaGVEaXIpXG4gICAgOiBhd2FpdCBidWlsZEZyb21Mb2NhbChzZWN0aW9uLnNvdXJjZSwgY29uZmlnLnJvb3QpXG5cbiAgaWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuXG5cbiAgYXdhaXQgcm0oY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICBhd2FpdCBta2RpcihjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBtYXJrZG93biA9IHdyYXBGcm9udG1hdHRlcihlbnRyeSwgc2VjdGlvbilcbiAgICBhd2FpdCB3cml0ZUZpbGUoam9pbihjYWNoZURpciwgYCR7ZW50cnkuc2x1Z30ubWRgKSwgbWFya2Rvd24sIFwidXRmLThcIilcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEZyb21Mb2NhbChzb3VyY2U6IHN0cmluZywgcm9vdDogc3RyaW5nKSB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZShyb290LCBzb3VyY2UpXG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKVxuICByZXR1cm4gc3BsaXRMb2NhbENoYW5nZWxvZyhib2R5KVxufVxuXG4vKiogUGFyc2UgQ0hBTkdFTE9HLm1kIGludG8gcGVyLXZlcnNpb24gZW50cmllcyB1c2luZyBtZGFzdCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0TG9jYWxDaGFuZ2Vsb2coYm9keTogc3RyaW5nKTogQ2hhbmdlbG9nRW50cnlbXSB7XG4gIGNvbnN0IHRyZWUgPSBwYXJzZXIucGFyc2UoYm9keSkgYXMgUm9vdFxuICBjb25zdCBlbnRyaWVzOiBDaGFuZ2Vsb2dFbnRyeVtdID0gW11cbiAgbGV0IGN1cnJlbnQ6IHsgaGVhZGluZzogc3RyaW5nOyBjaGlsZHJlbjogUm9vdENvbnRlbnRbXSB9IHwgdW5kZWZpbmVkXG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiB0cmVlLmNoaWxkcmVuKSB7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IFwiaGVhZGluZ1wiICYmIGNoaWxkLmRlcHRoID09PSAyKSB7XG4gICAgICBpZiAoY3VycmVudCkgZW50cmllcy5wdXNoKGZpbmFsaXplRW50cnkoY3VycmVudCkpXG4gICAgICBjdXJyZW50ID0geyBoZWFkaW5nOiBtZGFzdFRvU3RyaW5nKGNoaWxkKSwgY2hpbGRyZW46IFtdIH1cbiAgICB9IGVsc2UgaWYgKGN1cnJlbnQpIHtcbiAgICAgIGN1cnJlbnQuY2hpbGRyZW4ucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQpIGVudHJpZXMucHVzaChmaW5hbGl6ZUVudHJ5KGN1cnJlbnQpKVxuICByZXR1cm4gZW50cmllc1xufVxuXG5mdW5jdGlvbiBmaW5hbGl6ZUVudHJ5KGlucHV0OiB7XG4gIGhlYWRpbmc6IHN0cmluZ1xuICBjaGlsZHJlbjogUm9vdENvbnRlbnRbXVxufSk6IENoYW5nZWxvZ0VudHJ5IHtcbiAgY29uc3QgdmVyc2lvbk1hdGNoID0gaW5wdXQuaGVhZGluZy5tYXRjaCgvXlxcWz8oW15cXF1cXHNdKylcXF0/LylcbiAgY29uc3QgdmVyc2lvbiA9IHZlcnNpb25NYXRjaD8uWzFdID8/IGlucHV0LmhlYWRpbmdcbiAgY29uc3QgZGF0ZU1hdGNoID0gaW5wdXQuaGVhZGluZy5tYXRjaCgvXFxkezR9LVxcZHsyfS1cXGR7Mn0vKVxuICBjb25zdCBib2R5ID0gcmVuZGVyRW50cnlCb2R5KGlucHV0LmNoaWxkcmVuKVxuICByZXR1cm4ge1xuICAgIHNsdWc6IHNsdWdpZnkodmVyc2lvbiksXG4gICAgdGl0bGU6IHZlcnNpb24sXG4gICAgZGF0ZTogZGF0ZU1hdGNoPy5bMF0sXG4gICAgYm9keSxcbiAgfVxufVxuXG4vKiogU2VyaWFsaXplIGFuIGVudHJ5J3MgbWRhc3QgY2hpbGRyZW4gYmFjayB0byBtYXJrZG93biAqL1xuZnVuY3Rpb24gcmVuZGVyRW50cnlCb2R5KGNoaWxkcmVuOiBSb290Q29udGVudFtdKSB7XG4gIGNvbnN0IHJvb3Q6IFJvb3QgPSB7IHR5cGU6IFwicm9vdFwiLCBjaGlsZHJlbiB9XG4gIHJldHVybiBzdHJpbmdpZmllci5zdHJpbmdpZnkocm9vdCkudHJpbUVuZCgpXG59XG5cbi8qKiBTaGlmdCBoMuKAk2g2IHVwIGJ5IG9uZSBzbyB0aGUgdmVyc2lvbiBiZWNvbWVzIHRoZSBhcnRpY2xlJ3MgaDEgKi9cbmZ1bmN0aW9uIHByb21vdGVIZWFkaW5ncyhib2R5OiBzdHJpbmcpIHtcbiAgY29uc3QgdHJlZSA9IHBhcnNlci5wYXJzZShib2R5KSBhcyBSb290XG4gIHZpc2l0KHRyZWUsIFwiaGVhZGluZ1wiLCBub2RlID0+IHtcbiAgICBpZiAobm9kZS5kZXB0aCA+IDEpIG5vZGUuZGVwdGggPSAobm9kZS5kZXB0aCAtIDEpIGFzIDEgfCAyIHwgMyB8IDQgfCA1XG4gIH0pXG4gIHJldHVybiBzdHJpbmdpZmllci5zdHJpbmdpZnkodHJlZSkudHJpbUVuZCgpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRnJvbUdpdEh1YihcbiAgc291cmNlOiBzdHJpbmcsXG4gIG1ldGFQYXRoOiBzdHJpbmcsXG4gIGNhY2hlRGlyOiBzdHJpbmcsXG4pOiBQcm9taXNlPENoYW5nZWxvZ0VudHJ5W10gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VHaXRIdWJSZXBvKHNvdXJjZSlcbiAgaWYgKCFwYXJzZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSBHaXRIdWIgcmVwbyBmcm9tIHNvdXJjZTogJHtzb3VyY2V9YClcbiAgfVxuXG4gIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cGFyc2VkLm93bmVyfS8ke3BhcnNlZC5yZXBvfS9yZWxlYXNlcz9wZXJfcGFnZT0xMDBgXG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvblwiLFxuICAgIFwiWC1HaXRIdWItQXBpLVZlcnNpb25cIjogXCIyMDIyLTExLTI4XCIsXG4gIH1cblxuICBjb25zdCB0b2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTlxuICBpZiAodG9rZW4pIGhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHt0b2tlbn1gXG5cbiAgY29uc3QgbWV0YSA9IGF3YWl0IHJlYWRNZXRhKG1ldGFQYXRoKVxuICBjb25zdCBoYXNDYWNoZSA9IGF3YWl0IGV4aXN0cyhjYWNoZURpcilcbiAgaWYgKG1ldGEgJiYgaGFzQ2FjaGUpIGhlYWRlcnNbXCJJZi1Ob25lLU1hdGNoXCJdID0gbWV0YS5ldGFnXG5cbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSlcblxuICBpZiAocmVzLnN0YXR1cyA9PT0gMzA0KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCByZW1haW5pbmcgPSByZXMuaGVhZGVycy5nZXQoXCJ4LXJhdGVsaW1pdC1yZW1haW5pbmdcIilcbiAgICBjb25zdCByZXNldCA9IHJlcy5oZWFkZXJzLmdldChcIngtcmF0ZWxpbWl0LXJlc2V0XCIpXG4gICAgY29uc3QgbXNnID0gYEdpdEh1YiBBUEkgJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fSAocmF0ZS1saW1pdCByZW1haW5pbmc6ICR7cmVtYWluaW5nID8/IFwiP1wifSwgcmVzZXQ6ICR7cmVzZXQgPz8gXCI/XCJ9KWBcbiAgICBpZiAoaGFzQ2FjaGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHttc2d9IOKAlCBmYWxsaW5nIGJhY2sgdG8gY2FjaGVkIGNoYW5nZWxvZ2ApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cpXG4gIH1cblxuICBjb25zdCByZWxlYXNlcyA9IChhd2FpdCByZXMuanNvbigpKSBhcyBSZWxlYXNlW11cbiAgY29uc3QgZXRhZyA9IHJlcy5oZWFkZXJzLmdldChcImV0YWdcIilcbiAgaWYgKGV0YWcpIHtcbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBtZXRhUGF0aCxcbiAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICB7IGV0YWcsIGZldGNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0gc2F0aXNmaWVzIENhY2hlTWV0YSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgICksXG4gICAgICBcInV0Zi04XCIsXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VzLm1hcChyZWxlYXNlID0+ICh7XG4gICAgc2x1Zzogc2x1Z2lmeShyZWxlYXNlLnRhZ19uYW1lKSxcbiAgICB0aXRsZTogcmVsZWFzZS50YWdfbmFtZSxcbiAgICBkYXRlOiByZWxlYXNlLnB1Ymxpc2hlZF9hdD8uc2xpY2UoMCwgMTApLFxuICAgIGJvZHk6IChyZWxlYXNlLmJvZHkgPz8gXCJcIikudHJpbSgpLFxuICB9KSlcbn1cblxuZnVuY3Rpb24gd3JhcEZyb250bWF0dGVyKGVudHJ5OiBDaGFuZ2Vsb2dFbnRyeSwgc2VjdGlvbjogQ2hhbmdlbG9nU2VjdGlvbikge1xuICBjb25zdCBsaW5lcyA9IFtcbiAgICBcIi0tLVwiLFxuICAgIGB0aXRsZTogJHtlbnRyeS50aXRsZX1gLFxuICAgIGBwYXRoOiAke3NlY3Rpb24ucHJlZml4fSR7ZW50cnkuc2x1Z30vYCxcbiAgXVxuICBpZiAoZW50cnkuZGF0ZSkgbGluZXMucHVzaChgZGF0ZTogJHtlbnRyeS5kYXRlfWApXG4gIGxpbmVzLnB1c2goXCItLS1cIiwgXCJcIiwgYCMgJHtlbnRyeS50aXRsZX1gLCBcIlwiLCBwcm9tb3RlSGVhZGluZ3MoZW50cnkuYm9keSkpXG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNZXRhKG1ldGFQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENhY2hlTWV0YSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKG1ldGFQYXRoLCBcInV0Zi04XCIpXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBDYWNoZU1ldGFcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4aXN0cyhwYXRoOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhY2Nlc3MocGF0aClcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
2
|
+
import { splitLocalChangelog } from "./build.js";
|
|
3
|
+
describe("splitLocalChangelog", () => {
|
|
4
|
+
it("splits by h2 headings", () => {
|
|
5
|
+
const input = `# Changelog
|
|
6
|
+
|
|
7
|
+
## [0.2.0] - 2026-04-15
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Foo
|
|
12
|
+
|
|
13
|
+
## [0.1.0] - 2026-04-10
|
|
14
|
+
|
|
15
|
+
Initial release.
|
|
16
|
+
`;
|
|
17
|
+
const entries = splitLocalChangelog(input);
|
|
18
|
+
expect(entries).toHaveLength(2);
|
|
19
|
+
expect(entries[0]?.title).toBe("0.2.0");
|
|
20
|
+
expect(entries[0]?.date).toBe("2026-04-15");
|
|
21
|
+
expect(entries[0]?.slug).toBe("0-2-0");
|
|
22
|
+
expect(entries[1]?.title).toBe("0.1.0");
|
|
23
|
+
expect(entries[1]?.date).toBe("2026-04-10");
|
|
24
|
+
});
|
|
25
|
+
it("preserves h3 heading structure in body", () => {
|
|
26
|
+
const input = `## 1.0.0
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- Thing one
|
|
31
|
+
`;
|
|
32
|
+
const entries = splitLocalChangelog(input);
|
|
33
|
+
expect(entries[0]?.body).toContain("### Added");
|
|
34
|
+
expect(entries[0]?.body).toContain("- Thing one");
|
|
35
|
+
});
|
|
36
|
+
it("ignores ## inside fenced code blocks", () => {
|
|
37
|
+
const input = `## 1.0.0
|
|
38
|
+
|
|
39
|
+
Some prose.
|
|
40
|
+
|
|
41
|
+
\`\`\`md
|
|
42
|
+
## Not a real version heading
|
|
43
|
+
\`\`\`
|
|
44
|
+
|
|
45
|
+
## 0.9.0
|
|
46
|
+
|
|
47
|
+
Older.
|
|
48
|
+
`;
|
|
49
|
+
const entries = splitLocalChangelog(input);
|
|
50
|
+
expect(entries).toHaveLength(2);
|
|
51
|
+
expect(entries[0]?.title).toBe("1.0.0");
|
|
52
|
+
expect(entries[0]?.body).toContain("Not a real version heading");
|
|
53
|
+
expect(entries[1]?.title).toBe("0.9.0");
|
|
54
|
+
});
|
|
55
|
+
it("handles bare version headings without brackets or date", () => {
|
|
56
|
+
const input = `## v1.2.3
|
|
57
|
+
|
|
58
|
+
Release notes.
|
|
59
|
+
`;
|
|
60
|
+
const entries = splitLocalChangelog(input);
|
|
61
|
+
expect(entries[0]?.title).toBe("v1.2.3");
|
|
62
|
+
expect(entries[0]?.slug).toBe("v1-2-3");
|
|
63
|
+
expect(entries[0]?.date).toBeUndefined();
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQudW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FjdGlvbnMvY2hhbmdlbG9nL2J1aWxkLnVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRWhELFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7SUFDbkMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUMvQixNQUFNLEtBQUssR0FBRzs7Ozs7Ozs7Ozs7Q0FXakIsQ0FBQTtRQUNHLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDM0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDN0MsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1FBQ2hELE1BQU0sS0FBSyxHQUFHOzs7OztDQUtqQixDQUFBO1FBQ0csTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDMUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDbkQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLE1BQU0sS0FBSyxHQUFHOzs7Ozs7Ozs7OztDQVdqQixDQUFBO1FBQ0csTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDMUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMvQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1FBQ2hFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLEdBQUcsRUFBRTtRQUNoRSxNQUFNLEtBQUssR0FBRzs7O0NBR2pCLENBQUE7UUFDRyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMxQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQzFDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgeyBzcGxpdExvY2FsQ2hhbmdlbG9nIH0gZnJvbSBcIi4vYnVpbGQudHNcIlxuXG5kZXNjcmliZShcInNwbGl0TG9jYWxDaGFuZ2Vsb2dcIiwgKCkgPT4ge1xuICBpdChcInNwbGl0cyBieSBoMiBoZWFkaW5nc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBgIyBDaGFuZ2Vsb2dcblxuIyMgWzAuMi4wXSAtIDIwMjYtMDQtMTVcblxuIyMjIEFkZGVkXG5cbi0gRm9vXG5cbiMjIFswLjEuMF0gLSAyMDI2LTA0LTEwXG5cbkluaXRpYWwgcmVsZWFzZS5cbmBcbiAgICBjb25zdCBlbnRyaWVzID0gc3BsaXRMb2NhbENoYW5nZWxvZyhpbnB1dClcbiAgICBleHBlY3QoZW50cmllcykudG9IYXZlTGVuZ3RoKDIpXG4gICAgZXhwZWN0KGVudHJpZXNbMF0/LnRpdGxlKS50b0JlKFwiMC4yLjBcIilcbiAgICBleHBlY3QoZW50cmllc1swXT8uZGF0ZSkudG9CZShcIjIwMjYtMDQtMTVcIilcbiAgICBleHBlY3QoZW50cmllc1swXT8uc2x1ZykudG9CZShcIjAtMi0wXCIpXG4gICAgZXhwZWN0KGVudHJpZXNbMV0/LnRpdGxlKS50b0JlKFwiMC4xLjBcIilcbiAgICBleHBlY3QoZW50cmllc1sxXT8uZGF0ZSkudG9CZShcIjIwMjYtMDQtMTBcIilcbiAgfSlcblxuICBpdChcInByZXNlcnZlcyBoMyBoZWFkaW5nIHN0cnVjdHVyZSBpbiBib2R5XCIsICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IGAjIyAxLjAuMFxuXG4jIyMgQWRkZWRcblxuLSBUaGluZyBvbmVcbmBcbiAgICBjb25zdCBlbnRyaWVzID0gc3BsaXRMb2NhbENoYW5nZWxvZyhpbnB1dClcbiAgICBleHBlY3QoZW50cmllc1swXT8uYm9keSkudG9Db250YWluKFwiIyMjIEFkZGVkXCIpXG4gICAgZXhwZWN0KGVudHJpZXNbMF0/LmJvZHkpLnRvQ29udGFpbihcIi0gVGhpbmcgb25lXCIpXG4gIH0pXG5cbiAgaXQoXCJpZ25vcmVzICMjIGluc2lkZSBmZW5jZWQgY29kZSBibG9ja3NcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gYCMjIDEuMC4wXG5cblNvbWUgcHJvc2UuXG5cblxcYFxcYFxcYG1kXG4jIyBOb3QgYSByZWFsIHZlcnNpb24gaGVhZGluZ1xuXFxgXFxgXFxgXG5cbiMjIDAuOS4wXG5cbk9sZGVyLlxuYFxuICAgIGNvbnN0IGVudHJpZXMgPSBzcGxpdExvY2FsQ2hhbmdlbG9nKGlucHV0KVxuICAgIGV4cGVjdChlbnRyaWVzKS50b0hhdmVMZW5ndGgoMilcbiAgICBleHBlY3QoZW50cmllc1swXT8udGl0bGUpLnRvQmUoXCIxLjAuMFwiKVxuICAgIGV4cGVjdChlbnRyaWVzWzBdPy5ib2R5KS50b0NvbnRhaW4oXCJOb3QgYSByZWFsIHZlcnNpb24gaGVhZGluZ1wiKVxuICAgIGV4cGVjdChlbnRyaWVzWzFdPy50aXRsZSkudG9CZShcIjAuOS4wXCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGJhcmUgdmVyc2lvbiBoZWFkaW5ncyB3aXRob3V0IGJyYWNrZXRzIG9yIGRhdGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gYCMjIHYxLjIuM1xuXG5SZWxlYXNlIG5vdGVzLlxuYFxuICAgIGNvbnN0IGVudHJpZXMgPSBzcGxpdExvY2FsQ2hhbmdlbG9nKGlucHV0KVxuICAgIGV4cGVjdChlbnRyaWVzWzBdPy50aXRsZSkudG9CZShcInYxLjIuM1wiKVxuICAgIGV4cGVjdChlbnRyaWVzWzBdPy5zbHVnKS50b0JlKFwidjEtMi0zXCIpXG4gICAgZXhwZWN0KGVudHJpZXNbMF0/LmRhdGUpLnRvQmVVbmRlZmluZWQoKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -2,33 +2,28 @@ import { describe, expect, it } from "vite-plus/test";
|
|
|
2
2
|
import { defineConfig } from "./define.js";
|
|
3
3
|
describe("defineConfig", () => {
|
|
4
4
|
it("should accept include as a string", () => {
|
|
5
|
-
const config = defineConfig({
|
|
6
|
-
expect(config.
|
|
5
|
+
const config = defineConfig({ include: "articles/**/*.mdx" });
|
|
6
|
+
expect(config.include).toBe("articles/**/*.mdx");
|
|
7
7
|
});
|
|
8
8
|
it("should accept include as an array", () => {
|
|
9
9
|
const config = defineConfig({
|
|
10
|
-
|
|
10
|
+
include: ["articles/**/*.mdx", "guides/**/*.mdx"],
|
|
11
11
|
});
|
|
12
|
-
expect(config.
|
|
13
|
-
"articles/**/*.mdx",
|
|
14
|
-
"guides/**/*.mdx",
|
|
15
|
-
]);
|
|
12
|
+
expect(config.include).toEqual(["articles/**/*.mdx", "guides/**/*.mdx"]);
|
|
16
13
|
});
|
|
17
14
|
it("should accept optional exclude", () => {
|
|
18
15
|
const config = defineConfig({
|
|
19
|
-
|
|
16
|
+
include: "**/*.mdx",
|
|
17
|
+
exclude: "drafts/**",
|
|
20
18
|
});
|
|
21
|
-
expect(config.
|
|
19
|
+
expect(config.exclude).toBe("drafts/**");
|
|
22
20
|
});
|
|
23
21
|
it("should allow omitting exclude", () => {
|
|
24
|
-
const config = defineConfig({
|
|
25
|
-
expect(config.
|
|
26
|
-
});
|
|
27
|
-
it("should reject missing articles", () => {
|
|
28
|
-
expect(() => defineConfig({})).toThrow();
|
|
22
|
+
const config = defineConfig({ include: "**/*.mdx" });
|
|
23
|
+
expect(config.exclude).toBeUndefined();
|
|
29
24
|
});
|
|
30
25
|
it("should reject missing include", () => {
|
|
31
|
-
expect(() => defineConfig({
|
|
26
|
+
expect(() => defineConfig({})).toThrow();
|
|
32
27
|
});
|
|
33
28
|
});
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5lLnVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hY3Rpb25zL2NvbmZpZy9kZWZpbmUudW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRTFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO0lBQzVCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7UUFDM0MsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQTtRQUM3RCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ2xELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUM7WUFDMUIsT0FBTyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUM7U0FDbEQsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7SUFDMUUsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQztZQUMxQixPQUFPLEVBQUUsVUFBVTtZQUNuQixPQUFPLEVBQUUsV0FBVztTQUNyQixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMxQyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDdkMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUN4QyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDdkMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ2pELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwiLi9kZWZpbmUudHNcIlxuXG5kZXNjcmliZShcImRlZmluZUNvbmZpZ1wiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIGFjY2VwdCBpbmNsdWRlIGFzIGEgc3RyaW5nXCIsICgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBkZWZpbmVDb25maWcoeyBpbmNsdWRlOiBcImFydGljbGVzLyoqLyoubWR4XCIgfSlcbiAgICBleHBlY3QoY29uZmlnLmluY2x1ZGUpLnRvQmUoXCJhcnRpY2xlcy8qKi8qLm1keFwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGFjY2VwdCBpbmNsdWRlIGFzIGFuIGFycmF5XCIsICgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBkZWZpbmVDb25maWcoe1xuICAgICAgaW5jbHVkZTogW1wiYXJ0aWNsZXMvKiovKi5tZHhcIiwgXCJndWlkZXMvKiovKi5tZHhcIl0sXG4gICAgfSlcbiAgICBleHBlY3QoY29uZmlnLmluY2x1ZGUpLnRvRXF1YWwoW1wiYXJ0aWNsZXMvKiovKi5tZHhcIiwgXCJndWlkZXMvKiovKi5tZHhcIl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgYWNjZXB0IG9wdGlvbmFsIGV4Y2x1ZGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGRlZmluZUNvbmZpZyh7XG4gICAgICBpbmNsdWRlOiBcIioqLyoubWR4XCIsXG4gICAgICBleGNsdWRlOiBcImRyYWZ0cy8qKlwiLFxuICAgIH0pXG4gICAgZXhwZWN0KGNvbmZpZy5leGNsdWRlKS50b0JlKFwiZHJhZnRzLyoqXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgYWxsb3cgb21pdHRpbmcgZXhjbHVkZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gZGVmaW5lQ29uZmlnKHsgaW5jbHVkZTogXCIqKi8qLm1keFwiIH0pXG4gICAgZXhwZWN0KGNvbmZpZy5leGNsdWRlKS50b0JlVW5kZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCByZWplY3QgbWlzc2luZyBpbmNsdWRlXCIsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gZGVmaW5lQ29uZmlnKHt9IGFzIGFueSkpLnRvVGhyb3coKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -7,6 +7,7 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
|
|
|
7
7
|
return path;
|
|
8
8
|
};
|
|
9
9
|
import { dirname, resolve } from "node:path";
|
|
10
|
+
import { pathToFileURL } from "node:url";
|
|
10
11
|
import { defineConfig } from "./define.js";
|
|
11
12
|
/**
|
|
12
13
|
* Load and validate a config file, checking --config/-c CLI arg, then cwd.
|
|
@@ -15,8 +16,10 @@ export async function loadConfig(path) {
|
|
|
15
16
|
const configIndex = process.argv.findIndex(a => a === "-c" || a === "--config");
|
|
16
17
|
const cliPath = configIndex !== -1 ? process.argv[configIndex + 1] : undefined;
|
|
17
18
|
const resolved = resolve(path ?? cliPath ?? "livemark.config.ts");
|
|
18
|
-
|
|
19
|
+
// Cache-bust the ESM import so dev-server restart reloads edits on disk.
|
|
20
|
+
const url = `${pathToFileURL(resolved).href}?t=${Date.now()}`;
|
|
21
|
+
const module = await import(__rewriteRelativeImportExtension(url));
|
|
19
22
|
const input = defineConfig(module.default);
|
|
20
|
-
return { ...input, root: dirname(resolved) };
|
|
23
|
+
return { ...input, root: dirname(resolved), configPath: resolved };
|
|
21
24
|
}
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FjdGlvbnMvY29uZmlnL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBSXhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFMUM7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFhO0lBQzVDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUN4QyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFVBQVUsQ0FDcEMsQ0FBQTtJQUNELE1BQU0sT0FBTyxHQUFHLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUM5RSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxDQUFBO0lBQ2pFLHlFQUF5RTtJQUN6RSxNQUFNLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUE7SUFDN0QsTUFBTSxNQUFNLEdBQTRCLE1BQU0sTUFBTSxrQ0FBQyxHQUFHLEVBQUMsQ0FBQTtJQUN6RCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQXFDLENBQUMsQ0FBQTtJQUN4RSxPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUE7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIlxuaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uZmlnLnRzXCJcbmltcG9ydCB7IFVzZXJDb25maWcgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwiLi9kZWZpbmUudHNcIlxuXG4vKipcbiAqIExvYWQgYW5kIHZhbGlkYXRlIGEgY29uZmlnIGZpbGUsIGNoZWNraW5nIC0tY29uZmlnLy1jIENMSSBhcmcsIHRoZW4gY3dkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZyhwYXRoPzogc3RyaW5nKTogUHJvbWlzZTxDb25maWc+IHtcbiAgY29uc3QgY29uZmlnSW5kZXggPSBwcm9jZXNzLmFyZ3YuZmluZEluZGV4KFxuICAgIGEgPT4gYSA9PT0gXCItY1wiIHx8IGEgPT09IFwiLS1jb25maWdcIixcbiAgKVxuICBjb25zdCBjbGlQYXRoID0gY29uZmlnSW5kZXggIT09IC0xID8gcHJvY2Vzcy5hcmd2W2NvbmZpZ0luZGV4ICsgMV0gOiB1bmRlZmluZWRcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHBhdGggPz8gY2xpUGF0aCA/PyBcImxpdmVtYXJrLmNvbmZpZy50c1wiKVxuICAvLyBDYWNoZS1idXN0IHRoZSBFU00gaW1wb3J0IHNvIGRldi1zZXJ2ZXIgcmVzdGFydCByZWxvYWRzIGVkaXRzIG9uIGRpc2suXG4gIGNvbnN0IHVybCA9IGAke3BhdGhUb0ZpbGVVUkwocmVzb2x2ZWQpLmhyZWZ9P3Q9JHtEYXRlLm5vdygpfWBcbiAgY29uc3QgbW9kdWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGF3YWl0IGltcG9ydCh1cmwpXG4gIGNvbnN0IGlucHV0ID0gZGVmaW5lQ29uZmlnKG1vZHVsZS5kZWZhdWx0IGFzIHouaW5wdXQ8dHlwZW9mIFVzZXJDb25maWc+KVxuICByZXR1cm4geyAuLi5pbnB1dCwgcm9vdDogZGlybmFtZShyZXNvbHZlZCksIGNvbmZpZ1BhdGg6IHJlc29sdmVkIH1cbn1cbiJdfQ==
|
|
@@ -9,9 +9,9 @@ describe("loadConfig", () => {
|
|
|
9
9
|
});
|
|
10
10
|
it("should load config from explicit path", () => temporaryDirectoryTask(async (tmpDir) => {
|
|
11
11
|
const configPath = join(tmpDir, "livemark.config.ts");
|
|
12
|
-
fs.writeFileSync(configPath, 'export default {
|
|
12
|
+
fs.writeFileSync(configPath, 'export default { include: "articles/**/*.mdx" }\n');
|
|
13
13
|
const config = await loadConfig(configPath);
|
|
14
|
-
expect(config.
|
|
14
|
+
expect(config.include).toBe("articles/**/*.mdx");
|
|
15
15
|
expect(config.root).toBe(tmpDir);
|
|
16
16
|
}));
|
|
17
17
|
it("should validate loaded config", () => temporaryDirectoryTask(async (tmpDir) => {
|
|
@@ -20,4 +20,4 @@ describe("loadConfig", () => {
|
|
|
20
20
|
await expect(loadConfig(configPath)).rejects.toThrow();
|
|
21
21
|
}));
|
|
22
22
|
});
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWN0aW9ucy9jb25maWcvbG9hZC51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRXRDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzFCLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLE1BQU0sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUN0RSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUUsQ0FDL0Msc0JBQXNCLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUNyRCxFQUFFLENBQUMsYUFBYSxDQUNkLFVBQVUsRUFDVixtREFBbUQsQ0FDcEQsQ0FBQTtRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFDaEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVMLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUUsQ0FDdkMsc0JBQXNCLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUNyRCxFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFBO1FBQ25ELE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUN4RCxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ1AsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgdGVtcG9yYXJ5RGlyZWN0b3J5VGFzayB9IGZyb20gXCJ0ZW1weVwiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4vbG9hZC50c1wiXG5cbmRlc2NyaWJlKFwibG9hZENvbmZpZ1wiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIHRocm93IHdoZW4gbm8gY29uZmlnIGZpbGUgZXhpc3RzXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBleHBlY3QobG9hZENvbmZpZyhcIi9ub25leGlzdGVudC9jb25maWcudHNcIikpLnJlamVjdHMudG9UaHJvdygpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbG9hZCBjb25maWcgZnJvbSBleHBsaWNpdCBwYXRoXCIsICgpID0+XG4gICAgdGVtcG9yYXJ5RGlyZWN0b3J5VGFzayhhc3luYyB0bXBEaXIgPT4ge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4odG1wRGlyLCBcImxpdmVtYXJrLmNvbmZpZy50c1wiKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgY29uZmlnUGF0aCxcbiAgICAgICAgJ2V4cG9ydCBkZWZhdWx0IHsgaW5jbHVkZTogXCJhcnRpY2xlcy8qKi8qLm1keFwiIH1cXG4nLFxuICAgICAgKVxuICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhjb25maWdQYXRoKVxuICAgICAgZXhwZWN0KGNvbmZpZy5pbmNsdWRlKS50b0JlKFwiYXJ0aWNsZXMvKiovKi5tZHhcIilcbiAgICAgIGV4cGVjdChjb25maWcucm9vdCkudG9CZSh0bXBEaXIpXG4gICAgfSkpXG5cbiAgaXQoXCJzaG91bGQgdmFsaWRhdGUgbG9hZGVkIGNvbmZpZ1wiLCAoKSA9PlxuICAgIHRlbXBvcmFyeURpcmVjdG9yeVRhc2soYXN5bmMgdG1wRGlyID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHRtcERpciwgXCJsaXZlbWFyay5jb25maWcudHNcIilcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJleHBvcnQgZGVmYXVsdCB7fVxcblwiKVxuICAgICAgYXdhaXQgZXhwZWN0KGxvYWRDb25maWcoY29uZmlnUGF0aCkpLnJlamVjdHMudG9UaHJvdygpXG4gICAgfSkpXG59KVxuIl19
|
package/build/commands/build.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { Command } from "commander";
|
|
3
|
-
import {
|
|
3
|
+
import { createBuilder } from "vite";
|
|
4
4
|
const configFile = join(import.meta.dirname, "..", "website", "vite.config.ts");
|
|
5
5
|
/**
|
|
6
6
|
* Build the site for production.
|
|
@@ -8,6 +8,7 @@ const configFile = join(import.meta.dirname, "..", "website", "vite.config.ts");
|
|
|
8
8
|
export const build = new Command("build")
|
|
9
9
|
.description("Build the site for production")
|
|
10
10
|
.action(async () => {
|
|
11
|
-
await
|
|
11
|
+
const builder = await createBuilder({ configFile });
|
|
12
|
+
await builder.buildApp();
|
|
12
13
|
});
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jb21tYW5kcy9idWlsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtBQUUvRTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDdEMsV0FBVyxDQUFDLCtCQUErQixDQUFDO0tBQzVDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNqQixNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7SUFDbkQsTUFBTSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDMUIsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjcmVhdGVCdWlsZGVyIH0gZnJvbSBcInZpdGVcIlxuXG5jb25zdCBjb25maWdGaWxlID0gam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwid2Vic2l0ZVwiLCBcInZpdGUuY29uZmlnLnRzXCIpXG5cbi8qKlxuICogQnVpbGQgdGhlIHNpdGUgZm9yIHByb2R1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZCA9IG5ldyBDb21tYW5kKFwiYnVpbGRcIilcbiAgLmRlc2NyaXB0aW9uKFwiQnVpbGQgdGhlIHNpdGUgZm9yIHByb2R1Y3Rpb25cIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIoeyBjb25maWdGaWxlIH0pXG4gICAgYXdhaXQgYnVpbGRlci5idWlsZEFwcCgpXG4gIH0pXG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* List or copy overridable livemark files into `.livemark/`.
|
|
4
|
+
*
|
|
5
|
+
* Without an argument, prints every file you can shadow. With a path, copies
|
|
6
|
+
* the default from the livemark package into `.livemark/<path>`; fails if the
|
|
7
|
+
* destination already exists.
|
|
8
|
+
*/
|
|
9
|
+
export declare const escape: Command;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import pc from "picocolors";
|
|
5
|
+
import { OVERRIDE_SUBDIRS } from "../website/plugins/vite-livemark.js";
|
|
6
|
+
const defaultsRoot = join(import.meta.dirname, "..", "website");
|
|
7
|
+
/**
|
|
8
|
+
* List or copy overridable livemark files into `.livemark/`.
|
|
9
|
+
*
|
|
10
|
+
* Without an argument, prints every file you can shadow. With a path, copies
|
|
11
|
+
* the default from the livemark package into `.livemark/<path>`; fails if the
|
|
12
|
+
* destination already exists.
|
|
13
|
+
*/
|
|
14
|
+
export const escape = new Command("escape")
|
|
15
|
+
.description("List or copy overridable livemark files into .livemark/")
|
|
16
|
+
.argument("[path]", "path relative to .livemark/ (e.g. components/Footer.tsx)")
|
|
17
|
+
.action((relPath) => {
|
|
18
|
+
if (!relPath) {
|
|
19
|
+
for (const file of listOverridable())
|
|
20
|
+
console.log(file);
|
|
21
|
+
console.log(pc.dim("\nRun 'livemark escape <path>' to copy a file into .livemark/"));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const [first] = relPath.split("/");
|
|
25
|
+
if (!first || !OVERRIDE_SUBDIRS.includes(first) || relPath.includes("..")) {
|
|
26
|
+
console.error(pc.red(`Error: '${relPath}' is not under an overridable subdir (${OVERRIDE_SUBDIRS.join(", ")})`));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const src = join(defaultsRoot, relPath);
|
|
30
|
+
if (!existsSync(src) || !statSync(src).isFile()) {
|
|
31
|
+
console.error(pc.red(`Error: '${relPath}' is not a livemark file`));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const dest = join(process.cwd(), ".livemark", relPath);
|
|
35
|
+
if (existsSync(dest)) {
|
|
36
|
+
console.error(pc.red(`Error: .livemark/${relPath} already exists`));
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
40
|
+
writeFileSync(dest, readFileSync(src));
|
|
41
|
+
console.log(`Copied ${pc.dim(relPath)} → ${pc.green(`.livemark/${relPath}`)}`);
|
|
42
|
+
});
|
|
43
|
+
function listOverridable() {
|
|
44
|
+
const files = [];
|
|
45
|
+
for (const subdir of OVERRIDE_SUBDIRS) {
|
|
46
|
+
const dir = join(defaultsRoot, subdir);
|
|
47
|
+
if (!existsSync(dir))
|
|
48
|
+
continue;
|
|
49
|
+
for (const entry of readdirSync(dir)) {
|
|
50
|
+
if (statSync(join(dir, entry)).isFile())
|
|
51
|
+
files.push(`${subdir}/${entry}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return files.sort();
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNjYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY29tbWFuZHMvZXNjYXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFdBQVcsRUFDWCxZQUFZLEVBQ1osUUFBUSxFQUNSLGFBQWEsR0FDZCxNQUFNLFNBQVMsQ0FBQTtBQUNoQixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMzQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQTtBQUV0RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtBQUUvRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDO0tBQ3hDLFdBQVcsQ0FBQyx5REFBeUQsQ0FBQztLQUN0RSxRQUFRLENBQ1AsUUFBUSxFQUNSLDBEQUEwRCxDQUMzRDtLQUNBLE1BQU0sQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixLQUFLLE1BQU0sSUFBSSxJQUFJLGVBQWUsRUFBRTtZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxFQUFFLENBQUMsR0FBRyxDQUFDLCtEQUErRCxDQUFDLENBQ3hFLENBQUE7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2xDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFFLE9BQU8sQ0FBQyxLQUFLLENBQ1gsRUFBRSxDQUFDLEdBQUcsQ0FDSixXQUFXLE9BQU8seUNBQXlDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUMxRixDQUNGLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNoRCxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxPQUFPLDBCQUEwQixDQUFDLENBQUMsQ0FBQTtRQUNuRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN0RCxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7UUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQzdDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FDbEUsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUFBO0FBRUosU0FBUyxlQUFlO0lBQ3RCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUMxQixLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUFFLFNBQVE7UUFDOUIsS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUMzRSxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHN0YXRTeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxufSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgcGMgZnJvbSBcInBpY29jb2xvcnNcIlxuaW1wb3J0IHsgT1ZFUlJJREVfU1VCRElSUyB9IGZyb20gXCIuLi93ZWJzaXRlL3BsdWdpbnMvdml0ZS1saXZlbWFyay50c1wiXG5cbmNvbnN0IGRlZmF1bHRzUm9vdCA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIndlYnNpdGVcIilcblxuLyoqXG4gKiBMaXN0IG9yIGNvcHkgb3ZlcnJpZGFibGUgbGl2ZW1hcmsgZmlsZXMgaW50byBgLmxpdmVtYXJrL2AuXG4gKlxuICogV2l0aG91dCBhbiBhcmd1bWVudCwgcHJpbnRzIGV2ZXJ5IGZpbGUgeW91IGNhbiBzaGFkb3cuIFdpdGggYSBwYXRoLCBjb3BpZXNcbiAqIHRoZSBkZWZhdWx0IGZyb20gdGhlIGxpdmVtYXJrIHBhY2thZ2UgaW50byBgLmxpdmVtYXJrLzxwYXRoPmA7IGZhaWxzIGlmIHRoZVxuICogZGVzdGluYXRpb24gYWxyZWFkeSBleGlzdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBlc2NhcGUgPSBuZXcgQ29tbWFuZChcImVzY2FwZVwiKVxuICAuZGVzY3JpcHRpb24oXCJMaXN0IG9yIGNvcHkgb3ZlcnJpZGFibGUgbGl2ZW1hcmsgZmlsZXMgaW50byAubGl2ZW1hcmsvXCIpXG4gIC5hcmd1bWVudChcbiAgICBcIltwYXRoXVwiLFxuICAgIFwicGF0aCByZWxhdGl2ZSB0byAubGl2ZW1hcmsvIChlLmcuIGNvbXBvbmVudHMvRm9vdGVyLnRzeClcIixcbiAgKVxuICAuYWN0aW9uKChyZWxQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFyZWxQYXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgbGlzdE92ZXJyaWRhYmxlKCkpIGNvbnNvbGUubG9nKGZpbGUpXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgcGMuZGltKFwiXFxuUnVuICdsaXZlbWFyayBlc2NhcGUgPHBhdGg+JyB0byBjb3B5IGEgZmlsZSBpbnRvIC5saXZlbWFyay9cIiksXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBbZmlyc3RdID0gcmVsUGF0aC5zcGxpdChcIi9cIilcbiAgICBpZiAoIWZpcnN0IHx8ICFPVkVSUklERV9TVUJESVJTLmluY2x1ZGVzKGZpcnN0KSB8fCByZWxQYXRoLmluY2x1ZGVzKFwiLi5cIikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIHBjLnJlZChcbiAgICAgICAgICBgRXJyb3I6ICcke3JlbFBhdGh9JyBpcyBub3QgdW5kZXIgYW4gb3ZlcnJpZGFibGUgc3ViZGlyICgke09WRVJSSURFX1NVQkRJUlMuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuXG4gICAgY29uc3Qgc3JjID0gam9pbihkZWZhdWx0c1Jvb3QsIHJlbFBhdGgpXG4gICAgaWYgKCFleGlzdHNTeW5jKHNyYykgfHwgIXN0YXRTeW5jKHNyYykuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocGMucmVkKGBFcnJvcjogJyR7cmVsUGF0aH0nIGlzIG5vdCBhIGxpdmVtYXJrIGZpbGVgKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIGNvbnN0IGRlc3QgPSBqb2luKHByb2Nlc3MuY3dkKCksIFwiLmxpdmVtYXJrXCIsIHJlbFBhdGgpXG4gICAgaWYgKGV4aXN0c1N5bmMoZGVzdCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocGMucmVkKGBFcnJvcjogLmxpdmVtYXJrLyR7cmVsUGF0aH0gYWxyZWFkeSBleGlzdHNgKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIG1rZGlyU3luYyhkaXJuYW1lKGRlc3QpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIHdyaXRlRmlsZVN5bmMoZGVzdCwgcmVhZEZpbGVTeW5jKHNyYykpXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgQ29waWVkICR7cGMuZGltKHJlbFBhdGgpfSDihpIgJHtwYy5ncmVlbihgLmxpdmVtYXJrLyR7cmVsUGF0aH1gKX1gLFxuICAgIClcbiAgfSlcblxuZnVuY3Rpb24gbGlzdE92ZXJyaWRhYmxlKCkge1xuICBjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHN1YmRpciBvZiBPVkVSUklERV9TVUJESVJTKSB7XG4gICAgY29uc3QgZGlyID0gam9pbihkZWZhdWx0c1Jvb3QsIHN1YmRpcilcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkgY29udGludWVcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKGRpcikpIHtcbiAgICAgIGlmIChzdGF0U3luYyhqb2luKGRpciwgZW50cnkpKS5pc0ZpbGUoKSkgZmlsZXMucHVzaChgJHtzdWJkaXJ9LyR7ZW50cnl9YClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGVzLnNvcnQoKVxufVxuIl19
|
|
@@ -1,9 +1,58 @@
|
|
|
1
1
|
declare const _default: {
|
|
2
|
+
site?: string | undefined;
|
|
3
|
+
favicon?: string | undefined;
|
|
4
|
+
logo?: string | undefined;
|
|
2
5
|
title: string;
|
|
3
6
|
description: string;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
include: string | string[];
|
|
8
|
+
exclude?: string | string[] | undefined;
|
|
9
|
+
codeThemeLight: "ayu-light" | "catppuccin-latte" | "everforest-light" | "github-light" | "github-light-default" | "github-light-high-contrast" | "gruvbox-light-hard" | "gruvbox-light-medium" | "gruvbox-light-soft" | "horizon-bright" | "kanagawa-lotus" | "light-plus" | "material-theme-lighter" | "min-light" | "night-owl-light" | "one-light" | "rose-pine-dawn" | "slack-ochin" | "snazzy-light" | "solarized-light" | "vitesse-light";
|
|
10
|
+
codeThemeDark: "andromeeda" | "aurora-x" | "ayu-dark" | "ayu-mirage" | "catppuccin-frappe" | "catppuccin-macchiato" | "catppuccin-mocha" | "dark-plus" | "dracula" | "dracula-soft" | "everforest-dark" | "github-dark" | "github-dark-default" | "github-dark-dimmed" | "github-dark-high-contrast" | "gruvbox-dark-hard" | "gruvbox-dark-medium" | "gruvbox-dark-soft" | "horizon" | "houston" | "kanagawa-dragon" | "kanagawa-wave" | "laserwave" | "material-theme" | "material-theme-darker" | "material-theme-ocean" | "material-theme-palenight" | "min-dark" | "monokai" | "night-owl" | "nord" | "one-dark-pro" | "plastic" | "poimandres" | "red" | "rose-pine" | "rose-pine-moon" | "slack-dark" | "solarized-dark" | "synthwave-84" | "tokyo-night" | "vesper" | "vitesse-black" | "vitesse-dark";
|
|
11
|
+
links?: {
|
|
12
|
+
url: string;
|
|
13
|
+
title: string;
|
|
14
|
+
icon?: string | undefined;
|
|
15
|
+
prefix?: string | undefined;
|
|
16
|
+
position: "header" | "sidebar";
|
|
17
|
+
}[] | undefined;
|
|
18
|
+
sections?: ({
|
|
19
|
+
icon?: string | undefined;
|
|
20
|
+
title: string;
|
|
21
|
+
prefix: string;
|
|
22
|
+
position: "header" | "sidebar";
|
|
23
|
+
type: "article";
|
|
24
|
+
} | {
|
|
25
|
+
icon?: string | undefined;
|
|
26
|
+
title: string;
|
|
27
|
+
prefix: string;
|
|
28
|
+
position: "header" | "sidebar";
|
|
29
|
+
type: "blog";
|
|
30
|
+
} | {
|
|
31
|
+
icon?: string | undefined;
|
|
32
|
+
title: string;
|
|
33
|
+
prefix: string;
|
|
34
|
+
position: "header" | "sidebar";
|
|
35
|
+
type: "changelog";
|
|
36
|
+
source: string;
|
|
37
|
+
version?: boolean | undefined;
|
|
38
|
+
})[] | undefined;
|
|
39
|
+
patches?: {
|
|
40
|
+
file: string;
|
|
41
|
+
article: {
|
|
42
|
+
title?: string | undefined;
|
|
43
|
+
label?: string | undefined;
|
|
44
|
+
description?: string | undefined;
|
|
45
|
+
icon?: string | undefined;
|
|
46
|
+
order?: number | undefined;
|
|
47
|
+
path?: string | undefined;
|
|
48
|
+
group?: string | undefined;
|
|
49
|
+
sidebar?: boolean | undefined;
|
|
50
|
+
toc?: boolean | undefined;
|
|
51
|
+
image?: string | undefined;
|
|
52
|
+
author?: string | string[] | undefined;
|
|
53
|
+
date?: string | undefined;
|
|
54
|
+
tags?: string[] | undefined;
|
|
55
|
+
};
|
|
56
|
+
}[] | undefined;
|
|
8
57
|
};
|
|
9
58
|
export default _default;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineConfig } from "livemark";
|
|
2
2
|
export default defineConfig({
|
|
3
|
-
|
|
3
|
+
include: "docs/*.md",
|
|
4
4
|
});
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RvY3MvbWFya2Rvd24vaW5jbHVkZXMvZXhhbXBsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXZDLGVBQWUsWUFBWSxDQUFDO0lBQzFCLE9BQU8sRUFBRSxXQUFXO0NBQ3JCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJsaXZlbWFya1wiXG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIGluY2x1ZGU6IFwiZG9jcy8qLm1kXCIsXG59KVxuIl19
|