livemark 0.26.0 → 0.27.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/build/actions/config/define.d.ts +6 -0
- package/build/content/article.js +4 -11
- package/build/content-collections.js +2 -4
- package/build/helpers/agent-skills.d.ts +22 -0
- package/build/helpers/agent-skills.js +46 -0
- package/build/helpers/agent-skills.unit.d.ts +1 -0
- package/build/helpers/agent-skills.unit.js +49 -0
- package/build/helpers/article.d.ts +13 -0
- package/build/helpers/article.js +17 -1
- package/build/helpers/head.d.ts +7 -2
- package/build/helpers/head.js +13 -2
- package/build/helpers/head.unit.js +4 -2
- package/build/helpers/llms.d.ts +33 -0
- package/build/helpers/llms.js +72 -0
- package/build/helpers/llms.unit.d.ts +1 -0
- package/build/helpers/llms.unit.js +98 -0
- package/build/models/config.d.ts +20 -0
- package/build/models/config.js +8 -1
- package/build/plugins/vite-agents.d.ts +17 -0
- package/build/plugins/vite-agents.js +109 -0
- package/build/plugins/vite-agents.unit.d.ts +1 -0
- package/build/plugins/vite-agents.unit.js +20 -0
- package/build/plugins/vite-robots.d.ts +4 -2
- package/build/plugins/vite-robots.js +15 -2
- package/build/plugins/vite-robots.unit.js +5 -1
- package/build/vite.config.js +3 -1
- package/package.json +3 -2
- package/skills/livemark-configuration/SKILL.md +4 -0
- package/skills/livemark-customization/SKILL.md +1 -0
- package/source/content/article.ts +8 -13
- package/source/content-collections.ts +1 -4
- package/source/helpers/agent-skills.ts +59 -0
- package/source/helpers/agent-skills.unit.ts +56 -0
- package/source/helpers/article.ts +17 -0
- package/source/helpers/head.ts +12 -1
- package/source/helpers/head.unit.ts +3 -1
- package/source/helpers/llms.ts +109 -0
- package/source/helpers/llms.unit.ts +115 -0
- package/source/models/config.ts +11 -0
- package/source/plugins/vite-agents.ts +135 -0
- package/source/plugins/vite-agents.unit.ts +26 -0
- package/source/plugins/vite-robots.ts +18 -3
- package/source/plugins/vite-robots.unit.ts +7 -0
- package/source/vite.config.ts +2 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { buildArticleTree, compareArticleDate, compareArticleOrder, flattenArticleTree, } from "./article.js";
|
|
2
|
+
import { partitionBySection } from "./section.js";
|
|
3
|
+
/** Render `llms.txt`: the site title and description, then one Markdown link
|
|
4
|
+
* per article twin, grouped under each routed section in sidebar order. */
|
|
5
|
+
export function renderLlmsText(props) {
|
|
6
|
+
const lines = [`# ${props.config.title}`, "", `> ${props.config.description}`];
|
|
7
|
+
for (const group of groupArticles(props)) {
|
|
8
|
+
lines.push("", `## ${group.title}`, "", ...renderLinks(props.config, group.articles));
|
|
9
|
+
}
|
|
10
|
+
return `${lines.join("\n")}\n`;
|
|
11
|
+
}
|
|
12
|
+
/** Render the Markdown twin of a section's index page (a blog or changelog
|
|
13
|
+
* listing), which has no article of its own: links to the section's articles. */
|
|
14
|
+
export function renderSectionIndex(props) {
|
|
15
|
+
const group = groupArticles(props).find(g => g.prefix === props.section.prefix);
|
|
16
|
+
const lines = [
|
|
17
|
+
`# ${props.section.title}`,
|
|
18
|
+
"",
|
|
19
|
+
...renderLinks(props.config, group?.articles ?? []),
|
|
20
|
+
];
|
|
21
|
+
return `${lines.join("\n")}\n`;
|
|
22
|
+
}
|
|
23
|
+
/** Render the Markdown twin of an article: its title and description as the
|
|
24
|
+
* rendered page shows them, then the body without its own leading h1. */
|
|
25
|
+
export function renderMarkdownTwin(props) {
|
|
26
|
+
const article = props.article;
|
|
27
|
+
const parts = [`# ${article.title}`];
|
|
28
|
+
if (article.description)
|
|
29
|
+
parts.push(`> ${article.description}`);
|
|
30
|
+
parts.push(stripLeadingH1(props.content).trim());
|
|
31
|
+
return `${parts.join("\n\n")}\n`;
|
|
32
|
+
}
|
|
33
|
+
/** Path of an article's Markdown twin inside the build output (no base). */
|
|
34
|
+
export function buildTwinFileName(path) {
|
|
35
|
+
return `${path.replace(/^\//, "")}index.md`;
|
|
36
|
+
}
|
|
37
|
+
/** Drop a leading h1 so a title set by frontmatter or a patch is not shown twice */
|
|
38
|
+
export function stripLeadingH1(content) {
|
|
39
|
+
return content.replace(/^[ \t]*#\s+[^\n]*\n+/, "");
|
|
40
|
+
}
|
|
41
|
+
function buildTwinUrl(config, path) {
|
|
42
|
+
const host = config.site?.replace(/\/+$/, "") ?? "";
|
|
43
|
+
return `${host}${config.base ?? ""}${path}index.md`;
|
|
44
|
+
}
|
|
45
|
+
function groupArticles(props) {
|
|
46
|
+
const sections = props.config.sections?.filter((s) => s.type !== "custom") ?? [];
|
|
47
|
+
const buckets = partitionBySection([...props.articles].sort(compareArticleOrder), sections);
|
|
48
|
+
const groups = [
|
|
49
|
+
...sections.map(s => ({
|
|
50
|
+
prefix: s.prefix,
|
|
51
|
+
title: s.title,
|
|
52
|
+
dated: s.type !== "article",
|
|
53
|
+
})),
|
|
54
|
+
{ prefix: "__default__", title: sections.length ? "Other" : "Pages", dated: false },
|
|
55
|
+
];
|
|
56
|
+
return groups.flatMap(group => {
|
|
57
|
+
const bucket = buckets.get(group.prefix);
|
|
58
|
+
if (!bucket?.length)
|
|
59
|
+
return [];
|
|
60
|
+
const articles = group.dated
|
|
61
|
+
? [...bucket].sort(compareArticleDate)
|
|
62
|
+
: flattenArticleTree(buildArticleTree(bucket)).flatMap(path => bucket.find(a => a.path === path) ?? []);
|
|
63
|
+
return [{ prefix: group.prefix, title: group.title, articles }];
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function renderLinks(config, articles) {
|
|
67
|
+
return articles.map(article => {
|
|
68
|
+
const link = `[${article.title}](${buildTwinUrl(config, article.path)})`;
|
|
69
|
+
return article.description ? `- ${link}: ${article.description}` : `- ${link}`;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGxtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL2xsbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGtCQUFrQixHQUNuQixNQUFNLGNBQWMsQ0FBQTtBQUNyQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFXakQ7NEVBQzRFO0FBQzVFLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FHOUI7SUFDQyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7SUFDOUUsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUN2RixDQUFDO0lBQ0QsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtBQUNoQyxDQUFDO0FBRUQ7a0ZBQ2tGO0FBQ2xGLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUlsQztJQUNDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDL0UsTUFBTSxLQUFLLEdBQUc7UUFDWixLQUFLLEtBQUssQ0FBQyxPQUFPLENB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QUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDdEMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUNsRCxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FDaEQsQ0FBQTtRQUNMLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDakUsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsTUFBcUMsRUFBRSxRQUF1QjtJQUNqRixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUE7UUFDeEUsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUE7SUFDaEYsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgdHlwZSB7IFJvdXRlZFNlY3Rpb24gfSBmcm9tIFwiLi4vbW9kZWxzL3NlY3Rpb24udHNcIlxuaW1wb3J0IHtcbiAgYnVpbGRBcnRpY2xlVHJlZSxcbiAgY29tcGFyZUFydGljbGVEYXRlLFxuICBjb21wYXJlQXJ0aWNsZU9yZGVyLFxuICBmbGF0dGVuQXJ0aWNsZVRyZWUsXG59IGZyb20gXCIuL2FydGljbGUudHNcIlxuaW1wb3J0IHsgcGFydGl0aW9uQnlTZWN0aW9uIH0gZnJvbSBcIi4vc2VjdGlvbi50c1wiXG5cbi8qKiBUaGUgc2xpY2Ugb2YgYSBidWlsdCBhcnRpY2xlIHRoYXQgYWdlbnQtZmFjaW5nIGZpbGVzIGFyZSByZW5kZXJlZCBmcm9tLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMbG1zQXJ0aWNsZSB7XG4gIHBhdGg6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIG9yZGVyPzogbnVtYmVyXG4gIGRhdGU/OiBzdHJpbmdcbn1cblxuLyoqIFJlbmRlciBgbGxtcy50eHRgOiB0aGUgc2l0ZSB0aXRsZSBhbmQgZGVzY3JpcHRpb24sIHRoZW4gb25lIE1hcmtkb3duIGxpbmtcbiAqICBwZXIgYXJ0aWNsZSB0d2luLCBncm91cGVkIHVuZGVyIGVhY2ggcm91dGVkIHNlY3Rpb24gaW4gc2lkZWJhciBvcmRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJMbG1zVGV4dChwcm9wczoge1xuICBjb25maWc6IFBpY2s8Q29uZmlnLCBcInRpdGxlXCIgfCBcImRlc2NyaXB0aW9uXCIgfCBcInNpdGVcIiB8IFwiYmFzZVwiIHwgXCJzZWN0aW9uc1wiPlxuICBhcnRpY2xlczogTGxtc0FydGljbGVbXVxufSkge1xuICBjb25zdCBsaW5lcyA9IFtgIyAke3Byb3BzLmNvbmZpZy50aXRsZX1gLCBcIlwiLCBgPiAke3Byb3BzLmNvbmZpZy5kZXNjcmlwdGlvbn1gXVxuICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3VwQXJ0aWNsZXMocHJvcHMpKSB7XG4gICAgbGluZXMucHVzaChcIlwiLCBgIyMgJHtncm91cC50aXRsZX1gLCBcIlwiLCAuLi5yZW5kZXJMaW5rcyhwcm9wcy5jb25maWcsIGdyb3VwLmFydGljbGVzKSlcbiAgfVxuICByZXR1cm4gYCR7bGluZXMuam9pbihcIlxcblwiKX1cXG5gXG59XG5cbi8qKiBSZW5kZXIgdGhlIE1hcmtkb3duIHR3aW4gb2YgYSBzZWN0aW9uJ3MgaW5kZXggcGFnZSAoYSBibG9nIG9yIGNoYW5nZWxvZ1xuICogIGxpc3RpbmcpLCB3aGljaCBoYXMgbm8gYXJ0aWNsZSBvZiBpdHMgb3duOiBsaW5rcyB0byB0aGUgc2VjdGlvbidzIGFydGljbGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb25JbmRleChwcm9wczoge1xuICBjb25maWc6IFBpY2s8Q29uZmlnLCBcInNpdGVcIiB8IFwiYmFzZVwiIHwgXCJzZWN0aW9uc1wiPlxuICBzZWN0aW9uOiBSb3V0ZWRTZWN0aW9uXG4gIGFydGljbGVzOiBMbG1zQXJ0aWNsZVtdXG59KSB7XG4gIGNvbnN0IGdyb3VwID0gZ3JvdXBBcnRpY2xlcyhwcm9wcykuZmluZChnID0+IGcucHJlZml4ID09PSBwcm9wcy5zZWN0aW9uLnByZWZpeClcbiAgY29uc3QgbGluZXMgPSBbXG4gICAgYCMgJHtwcm9wcy5zZWN0aW9uLnRpdGxlfWAsXG4gICAgXCJcIixcbiAgICAuLi5yZW5kZXJMaW5rcyhwcm9wcy5jb25maWcsIGdyb3VwPy5hcnRpY2xlcyA/PyBbXSksXG4gIF1cbiAgcmV0dXJuIGAke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuYFxufVxuXG4vKiogUmVuZGVyIHRoZSBNYXJrZG93biB0d2luIG9mIGFuIGFydGljbGU6IGl0cyB0aXRsZSBhbmQgZGVzY3JpcHRpb24gYXMgdGhlXG4gKiAgcmVuZGVyZWQgcGFnZSBzaG93cyB0aGVtLCB0aGVuIHRoZSBib2R5IHdpdGhvdXQgaXRzIG93biBsZWFkaW5nIGgxLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1hcmtkb3duVHdpbihwcm9wczogeyBhcnRpY2xlOiBMbG1zQXJ0aWNsZTsgY29udGVudDogc3RyaW5nIH0pIHtcbiAgY29uc3QgYXJ0aWNsZSA9IHByb3BzLmFydGljbGVcbiAgY29uc3QgcGFydHMgPSBbYCMgJHthcnRpY2xlLnRpdGxlfWBdXG4gIGlmIChhcnRpY2xlLmRlc2NyaXB0aW9uKSBwYXJ0cy5wdXNoKGA+ICR7YXJ0aWNsZS5kZXNjcmlwdGlvbn1gKVxuICBwYXJ0cy5wdXNoKHN0cmlwTGVhZGluZ0gxKHByb3BzLmNvbnRlbnQpLnRyaW0oKSlcbiAgcmV0dXJuIGAke3BhcnRzLmpvaW4oXCJcXG5cXG5cIil9XFxuYFxufVxuXG4vKiogUGF0aCBvZiBhbiBhcnRpY2xlJ3MgTWFya2Rvd24gdHdpbiBpbnNpZGUgdGhlIGJ1aWxkIG91dHB1dCAobm8gYmFzZSkuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUd2luRmlsZU5hbWUocGF0aDogc3RyaW5nKSB7XG4gIHJldHVybiBgJHtwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKX1pbmRleC5tZGBcbn1cblxuLyoqIERyb3AgYSBsZWFkaW5nIGgxIHNvIGEgdGl0bGUgc2V0IGJ5IGZyb250bWF0dGVyIG9yIGEgcGF0Y2ggaXMgbm90IHNob3duIHR3aWNlICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBMZWFkaW5nSDEoY29udGVudDogc3RyaW5nKSB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoL15bIFxcdF0qI1xccytbXlxcbl0qXFxuKy8sIFwiXCIpXG59XG5cbmZ1bmN0aW9uIGJ1aWxkVHdpblVybChjb25maWc6IFBpY2s8Q29uZmlnLCBcInNpdGVcIiB8IFwiYmFzZVwiPiwgcGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGhvc3QgPSBjb25maWcuc2l0ZT8ucmVwbGFjZSgvXFwvKyQvLCBcIlwiKSA/PyBcIlwiXG4gIHJldHVybiBgJHtob3N0fSR7Y29uZmlnLmJhc2UgPz8gXCJcIn0ke3BhdGh9aW5kZXgubWRgXG59XG5cbmZ1bmN0aW9uIGdyb3VwQXJ0aWNsZXMocHJvcHM6IHtcbiAgY29uZmlnOiBQaWNrPENvbmZpZywgXCJzZWN0aW9uc1wiPlxuICBhcnRpY2xlczogTGxtc0FydGljbGVbXVxufSkge1xuICBjb25zdCBzZWN0aW9ucyA9XG4gICAgcHJvcHMuY29uZmlnLnNlY3Rpb25zPy5maWx0ZXIoKHMpOiBzIGlzIFJvdXRlZFNlY3Rpb24gPT4gcy50eXBlICE9PSBcImN1c3RvbVwiKSA/PyBbXVxuICBjb25zdCBidWNrZXRzID0gcGFydGl0aW9uQnlTZWN0aW9uKFxuICAgIFsuLi5wcm9wcy5hcnRpY2xlc10uc29ydChjb21wYXJlQXJ0aWNsZU9yZGVyKSxcbiAgICBzZWN0aW9ucyxcbiAgKVxuICBjb25zdCBncm91cHMgPSBbXG4gICAgLi4uc2VjdGlvbnMubWFwKHMgPT4gKHtcbiAgICAgIHByZWZpeDogcy5wcmVmaXgsXG4gICAgICB0aXRsZTogcy50aXRsZSxcbiAgICAgIGRhdGVkOiBzLnR5cGUgIT09IFwiYXJ0aWNsZVwiLFxuICAgIH0pKSxcbiAgICB7IHByZWZpeDogXCJfX2RlZmF1bHRfX1wiLCB0aXRsZTogc2VjdGlvbnMubGVuZ3RoID8gXCJPdGhlclwiIDogXCJQYWdlc1wiLCBkYXRlZDogZmFsc2UgfSxcbiAgXVxuICByZXR1cm4gZ3JvdXBzLmZsYXRNYXAoZ3JvdXAgPT4ge1xuICAgIGNvbnN0IGJ1Y2tldCA9IGJ1Y2tldHMuZ2V0KGdyb3VwLnByZWZpeClcbiAgICBpZiAoIWJ1Y2tldD8ubGVuZ3RoKSByZXR1cm4gW11cbiAgICBjb25zdCBhcnRpY2xlcyA9IGdyb3VwLmRhdGVkXG4gICAgICA/IFsuLi5idWNrZXRdLnNvcnQoY29tcGFyZUFydGljbGVEYXRlKVxuICAgICAgOiBmbGF0dGVuQXJ0aWNsZVRyZWUoYnVpbGRBcnRpY2xlVHJlZShidWNrZXQpKS5mbGF0TWFwKFxuICAgICAgICAgIHBhdGggPT4gYnVja2V0LmZpbmQoYSA9PiBhLnBhdGggPT09IHBhdGgpID8/IFtdLFxuICAgICAgICApXG4gICAgcmV0dXJuIFt7IHByZWZpeDogZ3JvdXAucHJlZml4LCB0aXRsZTogZ3JvdXAudGl0bGUsIGFydGljbGVzIH1dXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHJlbmRlckxpbmtzKGNvbmZpZzogUGljazxDb25maWcsIFwic2l0ZVwiIHwgXCJiYXNlXCI+LCBhcnRpY2xlczogTGxtc0FydGljbGVbXSkge1xuICByZXR1cm4gYXJ0aWNsZXMubWFwKGFydGljbGUgPT4ge1xuICAgIGNvbnN0IGxpbmsgPSBgWyR7YXJ0aWNsZS50aXRsZX1dKCR7YnVpbGRUd2luVXJsKGNvbmZpZywgYXJ0aWNsZS5wYXRoKX0pYFxuICAgIHJldHVybiBhcnRpY2xlLmRlc2NyaXB0aW9uID8gYC0gJHtsaW5rfTogJHthcnRpY2xlLmRlc2NyaXB0aW9ufWAgOiBgLSAke2xpbmt9YFxuICB9KVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
2
|
+
import { buildTwinFileName, renderLlmsText, renderMarkdownTwin, renderSectionIndex, } from "./llms.js";
|
|
3
|
+
const config = { title: "Docs", description: "Blurb" };
|
|
4
|
+
describe("renderLlmsText", () => {
|
|
5
|
+
it("lists articles in sidebar order under a single heading without sections", () => {
|
|
6
|
+
const text = renderLlmsText({
|
|
7
|
+
config,
|
|
8
|
+
articles: [
|
|
9
|
+
{ path: "/guide/", title: "Guide", order: 2 },
|
|
10
|
+
{ path: "/intro/", title: "Intro", description: "Start here", order: 1 },
|
|
11
|
+
{ path: "/guide/deep/", title: "Deep" },
|
|
12
|
+
],
|
|
13
|
+
});
|
|
14
|
+
expect(text).toBe([
|
|
15
|
+
"# Docs",
|
|
16
|
+
"",
|
|
17
|
+
"> Blurb",
|
|
18
|
+
"",
|
|
19
|
+
"## Pages",
|
|
20
|
+
"",
|
|
21
|
+
"- [Intro](/intro/index.md): Start here",
|
|
22
|
+
"- [Guide](/guide/index.md)",
|
|
23
|
+
"- [Deep](/guide/deep/index.md)",
|
|
24
|
+
"",
|
|
25
|
+
].join("\n"));
|
|
26
|
+
});
|
|
27
|
+
it("groups by routed section, newest first in a blog, with absolute urls", () => {
|
|
28
|
+
const text = renderLlmsText({
|
|
29
|
+
config: {
|
|
30
|
+
...config,
|
|
31
|
+
site: "https://example.com/",
|
|
32
|
+
base: "/repo",
|
|
33
|
+
sections: [
|
|
34
|
+
{ title: "Docs", prefix: "/", type: "article", position: "header" },
|
|
35
|
+
{ title: "Blog", prefix: "/blog/", type: "blog", position: "header" },
|
|
36
|
+
{
|
|
37
|
+
title: "GitHub",
|
|
38
|
+
url: "https://github.com",
|
|
39
|
+
type: "custom",
|
|
40
|
+
position: "header",
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
articles: [
|
|
45
|
+
{ path: "/blog/old/", title: "Old", date: "2026-01-01" },
|
|
46
|
+
{ path: "/intro/", title: "Intro" },
|
|
47
|
+
{ path: "/blog/new/", title: "New", date: "2026-02-01" },
|
|
48
|
+
],
|
|
49
|
+
});
|
|
50
|
+
expect(text).toContain([
|
|
51
|
+
"## Docs",
|
|
52
|
+
"",
|
|
53
|
+
"- [Intro](https://example.com/repo/intro/index.md)",
|
|
54
|
+
"",
|
|
55
|
+
"## Blog",
|
|
56
|
+
"",
|
|
57
|
+
"- [New](https://example.com/repo/blog/new/index.md)",
|
|
58
|
+
"- [Old](https://example.com/repo/blog/old/index.md)",
|
|
59
|
+
].join("\n"));
|
|
60
|
+
expect(text).not.toContain("GitHub");
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe("renderSectionIndex", () => {
|
|
64
|
+
it("lists only the section's articles, newest first", () => {
|
|
65
|
+
const blog = {
|
|
66
|
+
title: "Blog",
|
|
67
|
+
prefix: "/blog/",
|
|
68
|
+
type: "blog",
|
|
69
|
+
position: "header",
|
|
70
|
+
};
|
|
71
|
+
const text = renderSectionIndex({
|
|
72
|
+
config: { sections: [blog] },
|
|
73
|
+
section: blog,
|
|
74
|
+
articles: [
|
|
75
|
+
{ path: "/intro/", title: "Intro" },
|
|
76
|
+
{ path: "/blog/old/", title: "Old", date: "2026-01-01" },
|
|
77
|
+
{ path: "/blog/new/", title: "New", date: "2026-02-01", description: "Fresh" },
|
|
78
|
+
],
|
|
79
|
+
});
|
|
80
|
+
expect(text).toBe("# Blog\n\n- [New](/blog/new/index.md): Fresh\n- [Old](/blog/old/index.md)\n");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("renderMarkdownTwin", () => {
|
|
84
|
+
it("leads with the title and description instead of the body's own h1", () => {
|
|
85
|
+
const twin = renderMarkdownTwin({
|
|
86
|
+
article: { path: "/intro/", title: "Introduction", description: "Start here" },
|
|
87
|
+
content: "# Livemark\n\nBody text\n",
|
|
88
|
+
});
|
|
89
|
+
expect(twin).toBe("# Introduction\n\n> Start here\n\nBody text\n");
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe("buildTwinFileName", () => {
|
|
93
|
+
it("places the twin beside the page's index.html", () => {
|
|
94
|
+
expect(buildTwinFileName("/")).toBe("index.md");
|
|
95
|
+
expect(buildTwinFileName("/guide/deep/")).toBe("guide/deep/index.md");
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGxtcy51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvbGxtcy51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXJELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSxXQUFXLENBQUE7QUFFbEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQTtBQUV0RCxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLEVBQUUsQ0FBQyx5RUFBeUUsRUFBRSxHQUFHLEVBQUU7UUFDakYsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDO1lBQzFCLE1BQU07WUFDTixRQUFRLEVBQUU7Z0JBQ1IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtnQkFDN0MsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO2dCQUN4RSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTthQUN4QztTQUNGLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ2Y7WUFDRSxRQUFRO1lBQ1IsRUFBRTtZQUNGLFNBQVM7WUFDVCxFQUFFO1lBQ0YsVUFBVTtZQUNWLEVBQUU7WUFDRix3Q0FBd0M7WUFDeEMsNEJBQTRCO1lBQzVCLGdDQUFnQztZQUNoQyxFQUFFO1NBQ0gsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ2IsQ0FBQTtJQUNILENB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QVksRUFBRTtZQUM5RSxPQUFPLEVBQUUsMkJBQTJCO1NBQ3JDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQTtJQUNwRSxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1FBQ3RELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUMvQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUN2RSxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHR5cGUgeyBSb3V0ZWRTZWN0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZWN0aW9uLnRzXCJcbmltcG9ydCB7XG4gIGJ1aWxkVHdpbkZpbGVOYW1lLFxuICByZW5kZXJMbG1zVGV4dCxcbiAgcmVuZGVyTWFya2Rvd25Ud2luLFxuICByZW5kZXJTZWN0aW9uSW5kZXgsXG59IGZyb20gXCIuL2xsbXMudHNcIlxuXG5jb25zdCBjb25maWcgPSB7IHRpdGxlOiBcIkRvY3NcIiwgZGVzY3JpcHRpb246IFwiQmx1cmJcIiB9XG5cbmRlc2NyaWJlKFwicmVuZGVyTGxtc1RleHRcIiwgKCkgPT4ge1xuICBpdChcImxpc3RzIGFydGljbGVzIGluIHNpZGViYXIgb3JkZXIgdW5kZXIgYSBzaW5nbGUgaGVhZGluZyB3aXRob3V0IHNlY3Rpb25zXCIsICgpID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gcmVuZGVyTGxtc1RleHQoe1xuICAgICAgY29uZmlnLFxuICAgICAgYXJ0aWNsZXM6IFtcbiAgICAgICAgeyBwYXRoOiBcIi9ndWlkZS9cIiwgdGl0bGU6IFwiR3VpZGVcIiwgb3JkZXI6IDIgfSxcbiAgICAgICAgeyBwYXRoOiBcIi9pbnRyby9cIiwgdGl0bGU6IFwiSW50cm9cIiwgZGVzY3JpcHRpb246IFwiU3RhcnQgaGVyZVwiLCBvcmRlcjogMSB9LFxuICAgICAgICB7IHBhdGg6IFwiL2d1aWRlL2RlZXAvXCIsIHRpdGxlOiBcIkRlZXBcIiB9LFxuICAgICAgXSxcbiAgICB9KVxuICAgIGV4cGVjdCh0ZXh0KS50b0JlKFxuICAgICAgW1xuICAgICAgICBcIiMgRG9jc1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBcIj4gQmx1cmJcIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgXCIjIyBQYWdlc1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBcIi0gW0ludHJvXSgvaW50cm8vaW5kZXgubWQpOiBTdGFydCBoZXJlXCIsXG4gICAgICAgIFwiLSBbR3VpZGVdKC9ndWlkZS9pbmRleC5tZClcIixcbiAgICAgICAgXCItIFtEZWVwXSgvZ3VpZGUvZGVlcC9pbmRleC5tZClcIixcbiAgICAgICAgXCJcIixcbiAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJncm91cHMgYnkgcm91dGVkIHNlY3Rpb24sIG5ld2VzdCBmaXJzdCBpbiBhIGJsb2csIHdpdGggYWJzb2x1dGUgdXJsc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IHJlbmRlckxsbXNUZXh0KHtcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAuLi5jb25maWcsXG4gICAgICAgIHNpdGU6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9cIixcbiAgICAgICAgYmFzZTogXCIvcmVwb1wiLFxuICAgICAgICBzZWN0aW9uczogW1xuICAgICAgICAgIHsgdGl0bGU6IFwiRG9jc1wiLCBwcmVmaXg6IFwiL1wiLCB0eXBlOiBcImFydGljbGVcIiwgcG9zaXRpb246IFwiaGVhZGVyXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIkJsb2dcIiwgcHJlZml4OiBcIi9ibG9nL1wiLCB0eXBlOiBcImJsb2dcIiwgcG9zaXRpb246IFwiaGVhZGVyXCIgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aXRsZTogXCJHaXRIdWJcIixcbiAgICAgICAgICAgIHVybDogXCJodHRwczovL2dpdGh1Yi5jb21cIixcbiAgICAgICAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICAgICAgICBwb3NpdGlvbjogXCJoZWFkZXJcIixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGFydGljbGVzOiBbXG4gICAgICAgIHsgcGF0aDogXCIvYmxvZy9vbGQvXCIsIHRpdGxlOiBcIk9sZFwiLCBkYXRlOiBcIjIwMjYtMDEtMDFcIiB9LFxuICAgICAgICB7IHBhdGg6IFwiL2ludHJvL1wiLCB0aXRsZTogXCJJbnRyb1wiIH0sXG4gICAgICAgIHsgcGF0aDogXCIvYmxvZy9uZXcvXCIsIHRpdGxlOiBcIk5ld1wiLCBkYXRlOiBcIjIwMjYtMDItMDFcIiB9LFxuICAgICAgXSxcbiAgICB9KVxuICAgIGV4cGVjdCh0ZXh0KS50b0NvbnRhaW4oXG4gICAgICBbXG4gICAgICAgIFwiIyMgRG9jc1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBcIi0gW0ludHJvXShodHRwczovL2V4YW1wbGUuY29tL3JlcG8vaW50cm8vaW5kZXgubWQpXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIFwiIyMgQmxvZ1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBcIi0gW05ld10oaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXBvL2Jsb2cvbmV3L2luZGV4Lm1kKVwiLFxuICAgICAgICBcIi0gW09sZF0oaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXBvL2Jsb2cvb2xkL2luZGV4Lm1kKVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgIClcbiAgICBleHBlY3QodGV4dCkubm90LnRvQ29udGFpbihcIkdpdEh1YlwiKVxuICB9KVxufSlcblxuZGVzY3JpYmUoXCJyZW5kZXJTZWN0aW9uSW5kZXhcIiwgKCkgPT4ge1xuICBpdChcImxpc3RzIG9ubHkgdGhlIHNlY3Rpb24ncyBhcnRpY2xlcywgbmV3ZXN0IGZpcnN0XCIsICgpID0+IHtcbiAgICBjb25zdCBibG9nOiBSb3V0ZWRTZWN0aW9uID0ge1xuICAgICAgdGl0bGU6IFwiQmxvZ1wiLFxuICAgICAgcHJlZml4OiBcIi9ibG9nL1wiLFxuICAgICAgdHlwZTogXCJibG9nXCIsXG4gICAgICBwb3NpdGlvbjogXCJoZWFkZXJcIixcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHJlbmRlclNlY3Rpb25JbmRleCh7XG4gICAgICBjb25maWc6IHsgc2VjdGlvbnM6IFtibG9nXSB9LFxuICAgICAgc2VjdGlvbjogYmxvZyxcbiAgICAgIGFydGljbGVzOiBbXG4gICAgICAgIHsgcGF0aDogXCIvaW50cm8vXCIsIHRpdGxlOiBcIkludHJvXCIgfSxcbiAgICAgICAgeyBwYXRoOiBcIi9ibG9nL29sZC9cIiwgdGl0bGU6IFwiT2xkXCIsIGRhdGU6IFwiMjAyNi0wMS0wMVwiIH0sXG4gICAgICAgIHsgcGF0aDogXCIvYmxvZy9uZXcvXCIsIHRpdGxlOiBcIk5ld1wiLCBkYXRlOiBcIjIwMjYtMDItMDFcIiwgZGVzY3JpcHRpb246IFwiRnJlc2hcIiB9LFxuICAgICAgXSxcbiAgICB9KVxuICAgIGV4cGVjdCh0ZXh0KS50b0JlKFxuICAgICAgXCIjIEJsb2dcXG5cXG4tIFtOZXddKC9ibG9nL25ldy9pbmRleC5tZCk6IEZyZXNoXFxuLSBbT2xkXSgvYmxvZy9vbGQvaW5kZXgubWQpXFxuXCIsXG4gICAgKVxuICB9KVxufSlcblxuZGVzY3JpYmUoXCJyZW5kZXJNYXJrZG93blR3aW5cIiwgKCkgPT4ge1xuICBpdChcImxlYWRzIHdpdGggdGhlIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBpbnN0ZWFkIG9mIHRoZSBib2R5J3Mgb3duIGgxXCIsICgpID0+IHtcbiAgICBjb25zdCB0d2luID0gcmVuZGVyTWFya2Rvd25Ud2luKHtcbiAgICAgIGFydGljbGU6IHsgcGF0aDogXCIvaW50cm8vXCIsIHRpdGxlOiBcIkludHJvZHVjdGlvblwiLCBkZXNjcmlwdGlvbjogXCJTdGFydCBoZXJlXCIgfSxcbiAgICAgIGNvbnRlbnQ6IFwiIyBMaXZlbWFya1xcblxcbkJvZHkgdGV4dFxcblwiLFxuICAgIH0pXG4gICAgZXhwZWN0KHR3aW4pLnRvQmUoXCIjIEludHJvZHVjdGlvblxcblxcbj4gU3RhcnQgaGVyZVxcblxcbkJvZHkgdGV4dFxcblwiKVxuICB9KVxufSlcblxuZGVzY3JpYmUoXCJidWlsZFR3aW5GaWxlTmFtZVwiLCAoKSA9PiB7XG4gIGl0KFwicGxhY2VzIHRoZSB0d2luIGJlc2lkZSB0aGUgcGFnZSdzIGluZGV4Lmh0bWxcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZFR3aW5GaWxlTmFtZShcIi9cIikpLnRvQmUoXCJpbmRleC5tZFwiKVxuICAgIGV4cGVjdChidWlsZFR3aW5GaWxlTmFtZShcIi9ndWlkZS9kZWVwL1wiKSkudG9CZShcImd1aWRlL2RlZXAvaW5kZXgubWRcIilcbiAgfSlcbn0pXG4iXX0=
|
package/build/models/config.d.ts
CHANGED
|
@@ -21,6 +21,14 @@ export declare const Head: z.ZodObject<{
|
|
|
21
21
|
links: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodString>>>;
|
|
22
22
|
scripts: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodString>>>;
|
|
23
23
|
}, z.core.$strip>;
|
|
24
|
+
/** How automated systems may use the site's content, published as a
|
|
25
|
+
* `Content-Signal` line in the generated `robots.txt`. */
|
|
26
|
+
export type ContentSignals = z.infer<typeof ContentSignals>;
|
|
27
|
+
export declare const ContentSignals: z.ZodObject<{
|
|
28
|
+
search: z.ZodDefault<z.ZodBoolean>;
|
|
29
|
+
aiInput: z.ZodDefault<z.ZodBoolean>;
|
|
30
|
+
aiTrain: z.ZodDefault<z.ZodBoolean>;
|
|
31
|
+
}, z.core.$strip>;
|
|
24
32
|
/**
|
|
25
33
|
* User-provided configuration for Livemark.
|
|
26
34
|
*
|
|
@@ -200,6 +208,12 @@ export declare const UserConfig: z.ZodObject<{
|
|
|
200
208
|
links: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodString>>>;
|
|
201
209
|
scripts: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodString>>>;
|
|
202
210
|
}, z.core.$strip>>;
|
|
211
|
+
contentSignals: z.ZodPrefault<z.ZodObject<{
|
|
212
|
+
search: z.ZodDefault<z.ZodBoolean>;
|
|
213
|
+
aiInput: z.ZodDefault<z.ZodBoolean>;
|
|
214
|
+
aiTrain: z.ZodDefault<z.ZodBoolean>;
|
|
215
|
+
}, z.core.$strip>>;
|
|
216
|
+
skills: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
203
217
|
vite: z.ZodOptional<z.ZodUnknown>;
|
|
204
218
|
}, z.core.$strip>;
|
|
205
219
|
/** Website configuration injected at build time via Vite define.
|
|
@@ -468,6 +482,12 @@ export declare const Config: z.ZodObject<{
|
|
|
468
482
|
links: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodString>>>;
|
|
469
483
|
scripts: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodString>>>;
|
|
470
484
|
}, z.core.$strip>>;
|
|
485
|
+
contentSignals: z.ZodPrefault<z.ZodObject<{
|
|
486
|
+
search: z.ZodDefault<z.ZodBoolean>;
|
|
487
|
+
aiInput: z.ZodDefault<z.ZodBoolean>;
|
|
488
|
+
aiTrain: z.ZodDefault<z.ZodBoolean>;
|
|
489
|
+
}, z.core.$strip>>;
|
|
490
|
+
skills: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
|
|
471
491
|
vite: z.ZodOptional<z.ZodUnknown>;
|
|
472
492
|
root: z.ZodString;
|
|
473
493
|
configPath: z.ZodString;
|
package/build/models/config.js
CHANGED
|
@@ -8,6 +8,11 @@ export const Head = z.object({
|
|
|
8
8
|
links: z.array(z.record(z.string(), z.string())).optional(),
|
|
9
9
|
scripts: z.array(z.record(z.string(), z.string())).optional(),
|
|
10
10
|
});
|
|
11
|
+
export const ContentSignals = z.object({
|
|
12
|
+
search: z.boolean().default(true),
|
|
13
|
+
aiInput: z.boolean().default(true),
|
|
14
|
+
aiTrain: z.boolean().default(true),
|
|
15
|
+
});
|
|
11
16
|
export const UserConfig = z.object({
|
|
12
17
|
site: z.string().optional(),
|
|
13
18
|
// Stored as `unknown` in the schema (zod can't type a function and
|
|
@@ -29,6 +34,8 @@ export const UserConfig = z.object({
|
|
|
29
34
|
sections: z.array(Section).optional(),
|
|
30
35
|
patches: z.array(Patch).optional(),
|
|
31
36
|
head: Head.optional(),
|
|
37
|
+
contentSignals: ContentSignals.prefault({}),
|
|
38
|
+
skills: z.union([z.string(), z.array(z.string())]).optional(),
|
|
32
39
|
// Stored as `unknown` in the schema (zod can't type a Vite UserConfig
|
|
33
40
|
// or a function returning one meaningfully); the public TypeScript
|
|
34
41
|
// surface above lifts it back to ViteOverride for editor support.
|
|
@@ -52,4 +59,4 @@ export const SystemConfig = z.object({
|
|
|
52
59
|
configPath: z.string(),
|
|
53
60
|
});
|
|
54
61
|
export const Config = UserConfig.merge(SystemConfig);
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL21vZGVscy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQXNCMUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDMUQsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDM0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDOUQsQ0FBQyxDQUFBO0FBY0YsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDakMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0IsbUVBQW1FO0lBQ25FLGtFQUFrRTtJQUNsRSxpRUFBaUU7SUFDakUsbUVBQW1FO0lBQ25FLGdFQUFnRTtJQUNoRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM5QixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUMzQixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFDckMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUM7SUFDMUQsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDOUQsY0FBYyxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFDMUQsYUFBYSxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFDeEQsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQy9CLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUNyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDbEMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7SUFDckIsc0VBQXNFO0lBQ3RFLG1FQUFtRTtJQUNuRSxrRUFBa0U7SUFDbEUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDN0IsQ0FBQyxDQUFBO0FBTUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDM0MsS0FBSyxFQUFFLElBQUk7SUFDWCxXQUFXLEVBQUUsSUFBSTtJQUNqQixJQUFJLEVBQUUsSUFBSTtJQUNWLE9BQU8sRUFBRSxJQUFJO0lBQ2IsSUFBSSxFQUFFLElBQUk7SUFDVixNQUFNLEVBQUUsSUFBSTtJQUNaLEtBQUssRUFBRSxJQUFJO0lBQ1gsUUFBUSxFQUFFLElBQUk7SUFDZCxJQUFJLEVBQUUsSUFBSTtDQUNYLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUM1QixDQUFDLENBQUE7QUFNRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNoQixVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtDQUN2QixDQUFDLENBQUE7QUFjRixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnRW52LCBVc2VyQ29uZmlnIGFzIFZpdGVVc2VyQ29uZmlnIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHsgTGluayB9IGZyb20gXCIuL2xpbmsudHNcIlxuaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwiLi9wYXRjaC50c1wiXG5pbXBvcnQgeyBTZWN0aW9uIH0gZnJvbSBcIi4vc2VjdGlvbi50c1wiXG5pbXBvcnQgeyBDb2RlVGhlbWVEYXJrLCBDb2RlVGhlbWVMaWdodCB9IGZyb20gXCIuL3RoZW1lLnRzXCJcblxuLyoqIEVzY2FwZSBoYXRjaCBmb3IgYXJiaXRyYXJ5IFZpdGUgY29uZmlnIOKAlCBhY2NlcHRzIGVpdGhlciBhIGNvbmZpZ1xuICogIG9iamVjdCAoc2ltcGxlIG92ZXJyaWRlcykgb3IgYSBmdW5jdGlvbiBmb3JtIChgKGVudikgPT4gY29uZmlnYCxcbiAqICBtYXRjaGluZyBWaXRlJ3Mgb3duIGBkZWZpbmVDb25maWdgKS4gTWVyZ2VkIG9uIHRvcCBvZiBsaXZlbWFyaydzXG4gKiAgZGVmYXVsdHMgdmlhIGBtZXJnZUNvbmZpZ2AsIHNvIHBsdWdpbiBhcnJheXMgY29uY2F0ZW5hdGUsIGRlZmluZXNcbiAqICBtZXJnZSwgZXRjLiBVc2UgdGhpcyBmb3IgZGVwbG95bWVudC10YXJnZXQgdHdlYWtzIChlLmcuIENGIFdvcmtlcnNcbiAqICB2aWEgYGVudmlyb25tZW50cy5zc3IucmVzb2x2ZS5jb25kaXRpb25zOiBbXCJ3b3JrZXJkXCIsIC4uLl1gKS4gKi9cbmV4cG9ydCB0eXBlIFZpdGVPdmVycmlkZSA9XG4gIHwgVml0ZVVzZXJDb25maWdcbiAgfCAoKGVudjogQ29uZmlnRW52KSA9PiBWaXRlVXNlckNvbmZpZyB8IFByb21pc2U8Vml0ZVVzZXJDb25maWc+KVxuXG4vKiogU3ViLXBhdGggbW91bnQuIFN0cmluZyBmb3JtIGlzIHVzZWQgYXMtaXM7IGZ1bmN0aW9uIGZvcm0gaXMgY2FsbGVkXG4gKiAgd2l0aCBWaXRlJ3MgYGNvbW1hbmRgIChgXCJzZXJ2ZVwiYCBpbiBkZXYsIGBcImJ1aWxkXCJgIGluIHByb2R1Y3Rpb24pIHNvXG4gKiAgdGhlIHVzZXIgY2FuIGJyYW5jaCAodHlwaWNhbCBjYXNlOiBzZXJ2ZSBhdCBgL2AgaW4gZGV2IGJ1dCBhdFxuICogIGAvcmVwby9gIGluIHByb2R1Y3Rpb24gZm9yIEdpdEh1YiBQYWdlcykuIFRoZSBidWlsZCBwaXBlbGluZVxuICogIHJlc29sdmVzIGl0IHRvIGEgc3RyaW5nIGJlZm9yZSBhbnkgcnVudGltZSBzZWVzIGl0LiAqL1xuZXhwb3J0IHR5cGUgQmFzZSA9IHN0cmluZyB8ICgoY29tbWFuZDogXCJidWlsZFwiIHwgXCJzZXJ2ZVwiKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpXG5cbi8qKiBFeHRyYSBzaXRlLXdpZGUgYDxoZWFkPmAgdGFncywgYXBwZW5kZWQgYWZ0ZXIgTGl2ZW1hcmsncyBkZWZhdWx0cy4gQSBtZXRhIHRhZ1xuICogIHNoYXJpbmcgYSBkZWZhdWx0J3MgYG5hbWVgIG9yIGBwcm9wZXJ0eWAgcmVwbGFjZXMgaXQuICovXG5leHBvcnQgdHlwZSBIZWFkID0gei5pbmZlcjx0eXBlb2YgSGVhZD5cbmV4cG9ydCBjb25zdCBIZWFkID0gei5vYmplY3Qoe1xuICBtZXRhOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpKS5vcHRpb25hbCgpLFxuICBsaW5rczogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKSkub3B0aW9uYWwoKSxcbiAgc2NyaXB0czogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKSkub3B0aW9uYWwoKSxcbn0pXG5cbi8qKlxuICogVXNlci1wcm92aWRlZCBjb25maWd1cmF0aW9uIGZvciBMaXZlbWFyay5cbiAqXG4gKiBgdml0ZWAgYW5kIGBiYXNlYCBhcmUgbGlmdGVkIGZyb20gYHVua25vd25gIHRvIHRoZWlyIHB1YmxpYyB0eXBlcyBzb1xuICogYGRlZmluZUNvbmZpZ2Agc2hvd3MgdGhlIHJpZ2h0IHNoYXBlIGluIGVkaXRvcnMuIFVzZSB0aGlzIHR5cGUgZm9yXG4gKiB0aGUgaW5wdXQgdG8gYGRlZmluZUNvbmZpZ2Ag4oCUIGl0IGtlZXBzIGRlZmF1bHRlZCBmaWVsZHMgb3B0aW9uYWxcbiAqIChiZWNhdXNlIHpvZCBpbnB1dCDiiaAgb3V0cHV0IGZvciBmaWVsZHMgd2l0aCBgLmRlZmF1bHQoKWApLlxuICovXG5leHBvcnQgdHlwZSBVc2VyQ29uZmlnID0gT21pdDx6LmlucHV0PHR5cGVvZiBVc2VyQ29uZmlnPiwgXCJ2aXRlXCIgfCBcImJhc2VcIj4gJiB7XG4gIHZpdGU/OiBWaXRlT3ZlcnJpZGVcbiAgYmFzZT86IEJhc2Vcbn1cbmV4cG9ydCBjb25zdCBVc2VyQ29uZmlnID0gei5vYmplY3Qoe1xuICBzaXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIC8vIFN0b3JlZCBhcyBgdW5rbm93bmAgaW4gdGhlIHNjaGVtYSAoem9kIGNhbid0IHR5cGUgYSBmdW5jdGlvbiBhbmRcbiAgLy8gc3RyaW5nIHVuaW9uIG1lYW5pbmdmdWxseSk7IHRoZSBwdWJsaWMgVHlwZVNjcmlwdCBzdXJmYWNlIGFib3ZlXG4gIC8vIGxpZnRzIGl0IGJhY2sgdG8gYEJhc2VgIGZvciBlZGl0b3Igc3VwcG9ydC4gVGhlIGJ1aWxkIHBpcGVsaW5lXG4gIC8vIHJlc29sdmVzIGl0IHZpYSBgcmVzb2x2ZUJhc2UoKWAgYmVmb3JlIGFueSBydW50aW1lIGNvbnN1bWVyIHNlZXNcbiAgLy8gaXQsIHNvIHRoZSBydW50aW1lIGBXZWJzaXRlQ29uZmlnLmJhc2VgIGlzIHN0cmljdGx5IGBzdHJpbmdgLlxuICBiYXNlOiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxuICBmYXZpY29uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGxvZ286IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdGl0bGU6IHouc3RyaW5nKCkuZGVmYXVsdChcIkxpdmVtYXJrXCIpLFxuICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5kZWZhdWx0KFwiTWFya2Rvd24gc2l0ZSBnZW5lcmF0b3JcIiksXG4gIGJhbm5lcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBpbmNsdWRlOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSkuZGVmYXVsdChcIioqLyoubWRcIiksXG4gIGV4Y2x1ZGU6IHoudW5pb24oW3ouc3RyaW5nKCksIHouYXJyYXkoei5zdHJpbmcoKSldKS5vcHRpb25hbCgpLFxuICBjb2RlVGhlbWVMaWdodDogQ29kZVRoZW1lTGlnaHQuZGVmYXVsdChcImNhdHBwdWNjaW4tbGF0dGVcIiksXG4gIGNvZGVUaGVtZURhcms6IENvZGVUaGVtZURhcmsuZGVmYXVsdChcImNhdHBwdWNjaW4tbW9jaGFcIiksXG4gIGxpbmtzOiB6LmFycmF5KExpbmspLm9wdGlvbmFsKCksXG4gIHNlY3Rpb25zOiB6LmFycmF5KFNlY3Rpb24pLm9wdGlvbmFsKCksXG4gIHBhdGNoZXM6IHouYXJyYXkoUGF0Y2gpLm9wdGlvbmFsKCksXG4gIGhlYWQ6IEhlYWQub3B0aW9uYWwoKSxcbiAgLy8gU3RvcmVkIGFzIGB1bmtub3duYCBpbiB0aGUgc2NoZW1hICh6b2QgY2FuJ3QgdHlwZSBhIFZpdGUgVXNlckNvbmZpZ1xuICAvLyBvciBhIGZ1bmN0aW9uIHJldHVybmluZyBvbmUgbWVhbmluZ2Z1bGx5KTsgdGhlIHB1YmxpYyBUeXBlU2NyaXB0XG4gIC8vIHN1cmZhY2UgYWJvdmUgbGlmdHMgaXQgYmFjayB0byBWaXRlT3ZlcnJpZGUgZm9yIGVkaXRvciBzdXBwb3J0LlxuICB2aXRlOiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxufSlcblxuLyoqIFdlYnNpdGUgY29uZmlndXJhdGlvbiBpbmplY3RlZCBhdCBidWlsZCB0aW1lIHZpYSBWaXRlIGRlZmluZS5cbiAqICBgYmFzZWAgaXMgc3RyaWN0bHkgYSBzdHJpbmcgaGVyZSDigJQgdGhlIGJ1aWxkIHBpcGVsaW5lIGhhcyBhbHJlYWR5XG4gKiAgcmVzb2x2ZWQgYW55IGZ1bmN0aW9uIGZvcm0gdmlhIGByZXNvbHZlQmFzZSgpYC4gKi9cbmV4cG9ydCB0eXBlIFdlYnNpdGVDb25maWcgPSB6LmluZmVyPHR5cGVvZiBXZWJzaXRlQ29uZmlnPlxuZXhwb3J0IGNvbnN0IFdlYnNpdGVDb25maWcgPSBVc2VyQ29uZmlnLnBpY2soe1xuICB0aXRsZTogdHJ1ZSxcbiAgZGVzY3JpcHRpb246IHRydWUsXG4gIHNpdGU6IHRydWUsXG4gIGZhdmljb246IHRydWUsXG4gIGxvZ286IHRydWUsXG4gIGJhbm5lcjogdHJ1ZSxcbiAgbGlua3M6IHRydWUsXG4gIHNlY3Rpb25zOiB0cnVlLFxuICBoZWFkOiB0cnVlLFxufSkuZXh0ZW5kKHtcbiAgYmFzZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSlcblxuLyoqXG4gKiBTeXN0ZW0tY29tcHV0ZWQgY29uZmlndXJhdGlvbiBkZXJpdmVkIGZyb20gdGhlIGNvbmZpZyBmaWxlIGxvY2F0aW9uLlxuICovXG5leHBvcnQgdHlwZSBTeXN0ZW1Db25maWcgPSB6LmluZmVyPHR5cGVvZiBTeXN0ZW1Db25maWc+XG5leHBvcnQgY29uc3QgU3lzdGVtQ29uZmlnID0gei5vYmplY3Qoe1xuICByb290OiB6LnN0cmluZygpLFxuICBjb25maWdQYXRoOiB6LnN0cmluZygpLFxufSlcblxuLyoqXG4gKiBGdWxseSByZXNvbHZlZCBMaXZlbWFyayBjb25maWd1cmF0aW9uLlxuICpcbiAqIGB2aXRlYCBzdGF5cyBgdW5rbm93bmAgYmVjYXVzZSB0aGF0J3Mgd2hhdCB0aGUgcnVudGltZSBzY2hlbWFcbiAqIHByb2R1Y2VzIOKAlCBjb25zdW1lci1mYWNpbmcgdHlwaW5nIGhhcHBlbnMgdmlhIHtAbGluayBVc2VyQ29uZmlnfSBzb1xuICogYGRlZmluZUNvbmZpZ2Agc2hvd3MgdGhlIHJpZ2h0IHNoYXBlIGluIGVkaXRvcnMuIGBiYXNlYCBpcyBsaWZ0ZWQgdG9cbiAqIGBzdHJpbmcgfCB1bmRlZmluZWRgIGJlY2F1c2UgYGxvYWRDb25maWcoKWAgcmVzb2x2ZXMgYW55IGZ1bmN0aW9uXG4gKiBmb3JtIHZpYSBgcmVzb2x2ZUJhc2UoKWAgYmVmb3JlIHJldHVybmluZy5cbiAqL1xuZXhwb3J0IHR5cGUgQ29uZmlnID0gT21pdDx6LmluZmVyPHR5cGVvZiBDb25maWc+LCBcImJhc2VcIj4gJiB7XG4gIGJhc2U/OiBzdHJpbmdcbn1cbmV4cG9ydCBjb25zdCBDb25maWcgPSBVc2VyQ29uZmlnLm1lcmdlKFN5c3RlbUNvbmZpZylcbiJdfQ==
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL21vZGVscy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQXNCMUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDMUQsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDM0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDOUQsQ0FBQyxDQUFBO0FBS0YsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ2pDLE9BQU8sRUFB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UUFBUSxFQUFFO0NBQzVCLENBQUMsQ0FBQTtBQU1GLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3ZCLENBQUMsQ0FBQTtBQWNGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgeyBMaW5rIH0gZnJvbSBcIi4vbGluay50c1wiXG5pbXBvcnQgeyBQYXRjaCB9IGZyb20gXCIuL3BhdGNoLnRzXCJcbmltcG9ydCB7IFNlY3Rpb24gfSBmcm9tIFwiLi9zZWN0aW9uLnRzXCJcbmltcG9ydCB7IENvZGVUaGVtZURhcmssIENvZGVUaGVtZUxpZ2h0IH0gZnJvbSBcIi4vdGhlbWUudHNcIlxuXG4vKiogRXNjYXBlIGhhdGNoIGZvciBhcmJpdHJhcnkgVml0ZSBjb25maWcg4oCUIGFjY2VwdHMgZWl0aGVyIGEgY29uZmlnXG4gKiAgb2JqZWN0IChzaW1wbGUgb3ZlcnJpZGVzKSBvciBhIGZ1bmN0aW9uIGZvcm0gKGAoZW52KSA9PiBjb25maWdgLFxuICogIG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLiBNZXJnZWQgb24gdG9wIG9mIGxpdmVtYXJrJ3NcbiAqICBkZWZhdWx0cyB2aWEgYG1lcmdlQ29uZmlnYCwgc28gcGx1Z2luIGFycmF5cyBjb25jYXRlbmF0ZSwgZGVmaW5lc1xuICogIG1lcmdlLCBldGMuIFVzZSB0aGlzIGZvciBkZXBsb3ltZW50LXRhcmdldCB0d2Vha3MgKGUuZy4gQ0YgV29ya2Vyc1xuICogIHZpYSBgZW52aXJvbm1lbnRzLnNzci5yZXNvbHZlLmNvbmRpdGlvbnM6IFtcIndvcmtlcmRcIiwgLi4uXWApLiAqL1xuZXhwb3J0IHR5cGUgVml0ZU92ZXJyaWRlID1cbiAgfCBWaXRlVXNlckNvbmZpZ1xuICB8ICgoZW52OiBDb25maWdFbnYpID0+IFZpdGVVc2VyQ29uZmlnIHwgUHJvbWlzZTxWaXRlVXNlckNvbmZpZz4pXG5cbi8qKiBTdWItcGF0aCBtb3VudC4gU3RyaW5nIGZvcm0gaXMgdXNlZCBhcy1pczsgZnVuY3Rpb24gZm9ybSBpcyBjYWxsZWRcbiAqICB3aXRoIFZpdGUncyBgY29tbWFuZGAgKGBcInNlcnZlXCJgIGluIGRldiwgYFwiYnVpbGRcImAgaW4gcHJvZHVjdGlvbikgc29cbiAqICB0aGUgdXNlciBjYW4gYnJhbmNoICh0eXBpY2FsIGNhc2U6IHNlcnZlIGF0IGAvYCBpbiBkZXYgYnV0IGF0XG4gKiAgYC9yZXBvL2AgaW4gcHJvZHVjdGlvbiBmb3IgR2l0SHViIFBhZ2VzKS4gVGhlIGJ1aWxkIHBpcGVsaW5lXG4gKiAgcmVzb2x2ZXMgaXQgdG8gYSBzdHJpbmcgYmVmb3JlIGFueSBydW50aW1lIHNlZXMgaXQuICovXG5leHBvcnQgdHlwZSBCYXNlID0gc3RyaW5nIHwgKChjb21tYW5kOiBcImJ1aWxkXCIgfCBcInNlcnZlXCIpID0+IHN0cmluZyB8IHVuZGVmaW5lZClcblxuLyoqIEV4dHJhIHNpdGUtd2lkZSBgPGhlYWQ+YCB0YWdzLCBhcHBlbmRlZCBhZnRlciBMaXZlbWFyaydzIGRlZmF1bHRzLiBBIG1ldGEgdGFnXG4gKiAgc2hhcmluZyBhIGRlZmF1bHQncyBgbmFtZWAgb3IgYHByb3BlcnR5YCByZXBsYWNlcyBpdC4gKi9cbmV4cG9ydCB0eXBlIEhlYWQgPSB6LmluZmVyPHR5cGVvZiBIZWFkPlxuZXhwb3J0IGNvbnN0IEhlYWQgPSB6Lm9iamVjdCh7XG4gIG1ldGE6IHouYXJyYXkoei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkpLm9wdGlvbmFsKCksXG4gIGxpbmtzOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpKS5vcHRpb25hbCgpLFxuICBzY3JpcHRzOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpKS5vcHRpb25hbCgpLFxufSlcblxuLyoqIEhvdyBhdXRvbWF0ZWQgc3lzdGVtcyBtYXkgdXNlIHRoZSBzaXRlJ3MgY29udGVudCwgcHVibGlzaGVkIGFzIGFcbiAqICBgQ29udGVudC1TaWduYWxgIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBgcm9ib3RzLnR4dGAuICovXG5leHBvcnQgdHlwZSBDb250ZW50U2lnbmFscyA9IHouaW5mZXI8dHlwZW9mIENvbnRlbnRTaWduYWxzPlxuZXhwb3J0IGNvbnN0IENvbnRlbnRTaWduYWxzID0gei5vYmplY3Qoe1xuICBzZWFyY2g6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gIGFpSW5wdXQ6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gIGFpVHJhaW46IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG59KVxuXG4vKipcbiAqIFVzZXItcHJvdmlkZWQgY29uZmlndXJhdGlvbiBmb3IgTGl2ZW1hcmsuXG4gKlxuICogYHZpdGVgIGFuZCBgYmFzZWAgYXJlIGxpZnRlZCBmcm9tIGB1bmtub3duYCB0byB0aGVpciBwdWJsaWMgdHlwZXMgc29cbiAqIGBkZWZpbmVDb25maWdgIHNob3dzIHRoZSByaWdodCBzaGFwZSBpbiBlZGl0b3JzLiBVc2UgdGhpcyB0eXBlIGZvclxuICogdGhlIGlucHV0IHRvIGBkZWZpbmVDb25maWdgIOKAlCBpdCBrZWVwcyBkZWZhdWx0ZWQgZmllbGRzIG9wdGlvbmFsXG4gKiAoYmVjYXVzZSB6b2QgaW5wdXQg4omgIG91dHB1dCBmb3IgZmllbGRzIHdpdGggYC5kZWZhdWx0KClgKS5cbiAqL1xuZXhwb3J0IHR5cGUgVXNlckNvbmZpZyA9IE9taXQ8ei5pbnB1dDx0eXBlb2YgVXNlckNvbmZpZz4sIFwidml0ZVwiIHwgXCJiYXNlXCI+ICYge1xuICB2aXRlPzogVml0ZU92ZXJyaWRlXG4gIGJhc2U/OiBCYXNlXG59XG5leHBvcnQgY29uc3QgVXNlckNvbmZpZyA9IHoub2JqZWN0KHtcbiAgc2l0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvLyBTdG9yZWQgYXMgYHVua25vd25gIGluIHRoZSBzY2hlbWEgKHpvZCBjYW4ndCB0eXBlIGEgZnVuY3Rpb24gYW5kXG4gIC8vIHN0cmluZyB1bmlvbiBtZWFuaW5nZnVsbHkpOyB0aGUgcHVibGljIFR5cGVTY3JpcHQgc3VyZmFjZSBhYm92ZVxuICAvLyBsaWZ0cyBpdCBiYWNrIHRvIGBCYXNlYCBmb3IgZWRpdG9yIHN1cHBvcnQuIFRoZSBidWlsZCBwaXBlbGluZVxuICAvLyByZXNvbHZlcyBpdCB2aWEgYHJlc29sdmVCYXNlKClgIGJlZm9yZSBhbnkgcnVudGltZSBjb25zdW1lciBzZWVzXG4gIC8vIGl0LCBzbyB0aGUgcnVudGltZSBgV2Vic2l0ZUNvbmZpZy5iYXNlYCBpcyBzdHJpY3RseSBgc3RyaW5nYC5cbiAgYmFzZTogei51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgZmF2aWNvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBsb2dvOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRpdGxlOiB6LnN0cmluZygpLmRlZmF1bHQoXCJMaXZlbWFya1wiKSxcbiAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkuZGVmYXVsdChcIk1hcmtkb3duIHNpdGUgZ2VuZXJhdG9yXCIpLFxuICBiYW5uZXI6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgaW5jbHVkZTogei51bmlvbihbei5zdHJpbmcoKSwgei5hcnJheSh6LnN0cmluZygpKV0pLmRlZmF1bHQoXCIqKi8qLm1kXCIpLFxuICBleGNsdWRlOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSkub3B0aW9uYWwoKSxcbiAgY29kZVRoZW1lTGlnaHQ6IENvZGVUaGVtZUxpZ2h0LmRlZmF1bHQoXCJjYXRwcHVjY2luLWxhdHRlXCIpLFxuICBjb2RlVGhlbWVEYXJrOiBDb2RlVGhlbWVEYXJrLmRlZmF1bHQoXCJjYXRwcHVjY2luLW1vY2hhXCIpLFxuICBsaW5rczogei5hcnJheShMaW5rKS5vcHRpb25hbCgpLFxuICBzZWN0aW9uczogei5hcnJheShTZWN0aW9uKS5vcHRpb25hbCgpLFxuICBwYXRjaGVzOiB6LmFycmF5KFBhdGNoKS5vcHRpb25hbCgpLFxuICBoZWFkOiBIZWFkLm9wdGlvbmFsKCksXG4gIGNvbnRlbnRTaWduYWxzOiBDb250ZW50U2lnbmFscy5wcmVmYXVsdCh7fSksXG4gIHNraWxsczogei51bmlvbihbei5zdHJpbmcoKSwgei5hcnJheSh6LnN0cmluZygpKV0pLm9wdGlvbmFsKCksXG4gIC8vIFN0b3JlZCBhcyBgdW5rbm93bmAgaW4gdGhlIHNjaGVtYSAoem9kIGNhbid0IHR5cGUgYSBWaXRlIFVzZXJDb25maWdcbiAgLy8gb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgb25lIG1lYW5pbmdmdWxseSk7IHRoZSBwdWJsaWMgVHlwZVNjcmlwdFxuICAvLyBzdXJmYWNlIGFib3ZlIGxpZnRzIGl0IGJhY2sgdG8gVml0ZU92ZXJyaWRlIGZvciBlZGl0b3Igc3VwcG9ydC5cbiAgdml0ZTogei51bmtub3duKCkub3B0aW9uYWwoKSxcbn0pXG5cbi8qKiBXZWJzaXRlIGNvbmZpZ3VyYXRpb24gaW5qZWN0ZWQgYXQgYnVpbGQgdGltZSB2aWEgVml0ZSBkZWZpbmUuXG4gKiAgYGJhc2VgIGlzIHN0cmljdGx5IGEgc3RyaW5nIGhlcmUg4oCUIHRoZSBidWlsZCBwaXBlbGluZSBoYXMgYWxyZWFkeVxuICogIHJlc29sdmVkIGFueSBmdW5jdGlvbiBmb3JtIHZpYSBgcmVzb2x2ZUJhc2UoKWAuICovXG5leHBvcnQgdHlwZSBXZWJzaXRlQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgV2Vic2l0ZUNvbmZpZz5cbmV4cG9ydCBjb25zdCBXZWJzaXRlQ29uZmlnID0gVXNlckNvbmZpZy5waWNrKHtcbiAgdGl0bGU6IHRydWUsXG4gIGRlc2NyaXB0aW9uOiB0cnVlLFxuICBzaXRlOiB0cnVlLFxuICBmYXZpY29uOiB0cnVlLFxuICBsb2dvOiB0cnVlLFxuICBiYW5uZXI6IHRydWUsXG4gIGxpbmtzOiB0cnVlLFxuICBzZWN0aW9uczogdHJ1ZSxcbiAgaGVhZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIGJhc2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pXG5cbi8qKlxuICogU3lzdGVtLWNvbXB1dGVkIGNvbmZpZ3VyYXRpb24gZGVyaXZlZCBmcm9tIHRoZSBjb25maWcgZmlsZSBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgU3lzdGVtQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgU3lzdGVtQ29uZmlnPlxuZXhwb3J0IGNvbnN0IFN5c3RlbUNvbmZpZyA9IHoub2JqZWN0KHtcbiAgcm9vdDogei5zdHJpbmcoKSxcbiAgY29uZmlnUGF0aDogei5zdHJpbmcoKSxcbn0pXG5cbi8qKlxuICogRnVsbHkgcmVzb2x2ZWQgTGl2ZW1hcmsgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBgdml0ZWAgc3RheXMgYHVua25vd25gIGJlY2F1c2UgdGhhdCdzIHdoYXQgdGhlIHJ1bnRpbWUgc2NoZW1hXG4gKiBwcm9kdWNlcyDigJQgY29uc3VtZXItZmFjaW5nIHR5cGluZyBoYXBwZW5zIHZpYSB7QGxpbmsgVXNlckNvbmZpZ30gc29cbiAqIGBkZWZpbmVDb25maWdgIHNob3dzIHRoZSByaWdodCBzaGFwZSBpbiBlZGl0b3JzLiBgYmFzZWAgaXMgbGlmdGVkIHRvXG4gKiBgc3RyaW5nIHwgdW5kZWZpbmVkYCBiZWNhdXNlIGBsb2FkQ29uZmlnKClgIHJlc29sdmVzIGFueSBmdW5jdGlvblxuICogZm9ybSB2aWEgYHJlc29sdmVCYXNlKClgIGJlZm9yZSByZXR1cm5pbmcuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZyA9IE9taXQ8ei5pbmZlcjx0eXBlb2YgQ29uZmlnPiwgXCJiYXNlXCI+ICYge1xuICBiYXNlPzogc3RyaW5nXG59XG5leHBvcnQgY29uc3QgQ29uZmlnID0gVXNlckNvbmZpZy5tZXJnZShTeXN0ZW1Db25maWcpXG4iXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
import type { Config } from "../models/config.ts";
|
|
3
|
+
export interface AgentsOptions {
|
|
4
|
+
config: Config;
|
|
5
|
+
}
|
|
6
|
+
/** Emit what AI agents look for into the client build: a Markdown twin of
|
|
7
|
+
* every article and section listing at `<path>index.md`, `llms.txt`, the Agent Skills index for
|
|
8
|
+
* `config.skills`, and a `_headers` file whose `Link` points agents at them. */
|
|
9
|
+
export declare function agents(opts: AgentsOptions): Plugin;
|
|
10
|
+
/** Render `_headers` (Cloudflare, Netlify): a `Link` on the home page naming
|
|
11
|
+
* `llms.txt`, its Markdown twin and the skills index, after any rules the
|
|
12
|
+
* project ships itself. */
|
|
13
|
+
export declare function renderHeaders(props: {
|
|
14
|
+
base?: string;
|
|
15
|
+
hasSkills: boolean;
|
|
16
|
+
existing?: string;
|
|
17
|
+
}): string;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
10
|
+
import { join, resolve } from "node:path";
|
|
11
|
+
import { pathToFileURL } from "node:url";
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { buildSkillFileName, loadAgentSkills, renderSkillsIndex, } from "../helpers/agent-skills.js";
|
|
14
|
+
import { buildTwinFileName, renderLlmsText, renderMarkdownTwin, renderSectionIndex, } from "../helpers/llms.js";
|
|
15
|
+
import { resolveIncludes } from "../helpers/resolve-includes.js";
|
|
16
|
+
const GeneratedArticles = z.array(z.object({
|
|
17
|
+
path: z.string(),
|
|
18
|
+
title: z.string(),
|
|
19
|
+
description: z.string().optional(),
|
|
20
|
+
order: z.number().optional(),
|
|
21
|
+
date: z.string().optional(),
|
|
22
|
+
file: z.string(),
|
|
23
|
+
content: z.string(),
|
|
24
|
+
}));
|
|
25
|
+
/** Emit what AI agents look for into the client build: a Markdown twin of
|
|
26
|
+
* every article and section listing at `<path>index.md`, `llms.txt`, the Agent Skills index for
|
|
27
|
+
* `config.skills`, and a `_headers` file whose `Link` points agents at them. */
|
|
28
|
+
export function agents(opts) {
|
|
29
|
+
const publicDir = join(opts.config.root, ".livemark", "public");
|
|
30
|
+
let root = "";
|
|
31
|
+
return {
|
|
32
|
+
name: "livemark:agents",
|
|
33
|
+
applyToEnvironment(env) {
|
|
34
|
+
return env.name === "client";
|
|
35
|
+
},
|
|
36
|
+
configResolved(resolved) {
|
|
37
|
+
root = resolved.root;
|
|
38
|
+
},
|
|
39
|
+
async generateBundle() {
|
|
40
|
+
// Vite copies the publicDir before writeBundle, so emitting a file the
|
|
41
|
+
// project ships under `.livemark/public/` would silently replace it.
|
|
42
|
+
const emit = (fileName, source) => {
|
|
43
|
+
if (existsSync(join(publicDir, fileName)))
|
|
44
|
+
return;
|
|
45
|
+
this.emitFile({ type: "asset", fileName, source });
|
|
46
|
+
};
|
|
47
|
+
const articles = await loadGeneratedArticles(root);
|
|
48
|
+
for (const article of articles) {
|
|
49
|
+
const content = resolveIncludes(article.content, resolve(opts.config.root, article.file));
|
|
50
|
+
emit(buildTwinFileName(article.path), renderMarkdownTwin({ article, content }));
|
|
51
|
+
}
|
|
52
|
+
const llms = renderLlmsText({ config: opts.config, articles });
|
|
53
|
+
emit("llms.txt", llms);
|
|
54
|
+
const hasTwin = (path) => articles.some(a => a.path === path);
|
|
55
|
+
if (!hasTwin("/"))
|
|
56
|
+
emit("index.md", llms);
|
|
57
|
+
// A rewrite to a missing twin is a 404, so every listing page needs one too.
|
|
58
|
+
for (const section of opts.config.sections ?? []) {
|
|
59
|
+
if (section.type === "custom" || section.prefix === "/")
|
|
60
|
+
continue;
|
|
61
|
+
if (hasTwin(section.prefix))
|
|
62
|
+
continue;
|
|
63
|
+
emit(buildTwinFileName(section.prefix), renderSectionIndex({ config: opts.config, section, articles }));
|
|
64
|
+
}
|
|
65
|
+
const patterns = opts.config.skills ?? [];
|
|
66
|
+
const skills = loadAgentSkills({
|
|
67
|
+
root: opts.config.root,
|
|
68
|
+
patterns: Array.isArray(patterns) ? patterns : [patterns],
|
|
69
|
+
});
|
|
70
|
+
for (const skill of skills)
|
|
71
|
+
emit(buildSkillFileName(skill.name), skill.source);
|
|
72
|
+
if (skills.length) {
|
|
73
|
+
emit(".well-known/agent-skills/index.json", renderSkillsIndex({ skills, base: opts.config.base }));
|
|
74
|
+
}
|
|
75
|
+
const headersFile = join(publicDir, "_headers");
|
|
76
|
+
this.emitFile({
|
|
77
|
+
type: "asset",
|
|
78
|
+
fileName: "_headers",
|
|
79
|
+
source: renderHeaders({
|
|
80
|
+
base: opts.config.base,
|
|
81
|
+
hasSkills: skills.length > 0,
|
|
82
|
+
existing: existsSync(headersFile) ? readFileSync(headersFile, "utf-8") : "",
|
|
83
|
+
}),
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Render `_headers` (Cloudflare, Netlify): a `Link` on the home page naming
|
|
89
|
+
* `llms.txt`, its Markdown twin and the skills index, after any rules the
|
|
90
|
+
* project ships itself. */
|
|
91
|
+
export function renderHeaders(props) {
|
|
92
|
+
const base = props.base ?? "";
|
|
93
|
+
const links = [
|
|
94
|
+
`<${base}/llms.txt>; rel="describedby"; type="text/plain"`,
|
|
95
|
+
`<${base}/index.md>; rel="alternate"; type="text/markdown"`,
|
|
96
|
+
];
|
|
97
|
+
if (props.hasSkills) {
|
|
98
|
+
links.push(`<${base}/.well-known/agent-skills/index.json>; rel="describedby"; type="application/json"`);
|
|
99
|
+
}
|
|
100
|
+
const rule = `${base}/\n Link: ${links.join(", ")}\n`;
|
|
101
|
+
const existing = props.existing?.trimEnd();
|
|
102
|
+
return existing ? `${existing}\n\n${rule}` : rule;
|
|
103
|
+
}
|
|
104
|
+
async function loadGeneratedArticles(root) {
|
|
105
|
+
const file = join(root, ".content-collections", "generated", "allArticles.js");
|
|
106
|
+
const module = await import(__rewriteRelativeImportExtension(pathToFileURL(file).href));
|
|
107
|
+
return GeneratedArticles.parse(module.default);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1hZ2VudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvcGx1Z2lucy92aXRlLWFnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFeEMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUN2QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixpQkFBaUIsR0FDbEIsTUFBTSw0QkFBNEIsQ0FBQTtBQUNuQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsa0JBQWtCLEdBQ25CLE1BQU0sb0JBQW9CLENBQUE7QUFDM0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBT2hFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNQLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2pCLFdBQVcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2xDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzVCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzNCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3BCLENBQUMsQ0FDSCxDQUFBO0FBRUQ7O2lG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LEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQixLQUFLLENBQUMsSUFBSSxDQUNSLElBQUksSUFBSSxtRkFBbUYsQ0FDNUYsQ0FBQTtJQUNILENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLElBQUksY0FBYyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUE7SUFDdEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUMxQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNuRCxDQUFDO0FBRUQsS0FBSyxVQUFVLHFCQUFxQixDQUFDLElBQVk7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtJQUM5RSxNQUFNLE1BQU0sR0FBeUIsTUFBTSxNQUFNLGtDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUMsQ0FBQTtJQUMzRSxPQUFPLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIlxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQge1xuICBidWlsZFNraWxsRmlsZU5hbWUsXG4gIGxvYWRBZ2VudFNraWxscyxcbiAgcmVuZGVyU2tpbGxzSW5kZXgsXG59IGZyb20gXCIuLi9oZWxwZXJzL2FnZW50LXNraWxscy50c1wiXG5pbXBvcnQge1xuICBidWlsZFR3aW5GaWxlTmFtZSxcbiAgcmVuZGVyTGxtc1RleHQsXG4gIHJlbmRlck1hcmtkb3duVHdpbixcbiAgcmVuZGVyU2VjdGlvbkluZGV4LFxufSBmcm9tIFwiLi4vaGVscGVycy9sbG1zLnRzXCJcbmltcG9ydCB7IHJlc29sdmVJbmNsdWRlcyB9IGZyb20gXCIuLi9oZWxwZXJzL3Jlc29sdmUtaW5jbHVkZXMudHNcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRzT3B0aW9ucyB7XG4gIGNvbmZpZzogQ29uZmlnXG59XG5cbmNvbnN0IEdlbmVyYXRlZEFydGljbGVzID0gei5hcnJheShcbiAgei5vYmplY3Qoe1xuICAgIHBhdGg6IHouc3RyaW5nKCksXG4gICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvcmRlcjogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIGRhdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBmaWxlOiB6LnN0cmluZygpLFxuICAgIGNvbnRlbnQ6IHouc3RyaW5nKCksXG4gIH0pLFxuKVxuXG4vKiogRW1pdCB3aGF0IEFJIGFnZW50cyBsb29rIGZvciBpbnRvIHRoZSBjbGllbnQgYnVpbGQ6IGEgTWFya2Rvd24gdHdpbiBvZlxuICogIGV2ZXJ5IGFydGljbGUgYW5kIHNlY3Rpb24gbGlzdGluZyBhdCBgPHBhdGg+aW5kZXgubWRgLCBgbGxtcy50eHRgLCB0aGUgQWdlbnQgU2tpbGxzIGluZGV4IGZvclxuICogIGBjb25maWcuc2tpbGxzYCwgYW5kIGEgYF9oZWFkZXJzYCBmaWxlIHdob3NlIGBMaW5rYCBwb2ludHMgYWdlbnRzIGF0IHRoZW0uICovXG5leHBvcnQgZnVuY3Rpb24gYWdlbnRzKG9wdHM6IEFnZW50c09wdGlvbnMpOiBQbHVnaW4ge1xuICBjb25zdCBwdWJsaWNEaXIgPSBqb2luKG9wdHMuY29uZmlnLnJvb3QsIFwiLmxpdmVtYXJrXCIsIFwicHVibGljXCIpXG4gIGxldCByb290ID0gXCJcIlxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwibGl2ZW1hcms6YWdlbnRzXCIsXG4gICAgYXBwbHlUb0Vudmlyb25tZW50KGVudikge1xuICAgICAgcmV0dXJuIGVudi5uYW1lID09PSBcImNsaWVudFwiXG4gICAgfSxcbiAgICBjb25maWdSZXNvbHZlZChyZXNvbHZlZCkge1xuICAgICAgcm9vdCA9IHJlc29sdmVkLnJvb3RcbiAgICB9LFxuICAgIGFzeW5jIGdlbmVyYXRlQnVuZGxlKCkge1xuICAgICAgLy8gVml0ZSBjb3BpZXMgdGhlIHB1YmxpY0RpciBiZWZvcmUgd3JpdGVCdW5kbGUsIHNvIGVtaXR0aW5nIGEgZmlsZSB0aGVcbiAgICAgIC8vIHByb2plY3Qgc2hpcHMgdW5kZXIgYC5saXZlbWFyay9wdWJsaWMvYCB3b3VsZCBzaWxlbnRseSByZXBsYWNlIGl0LlxuICAgICAgY29uc3QgZW1pdCA9IChmaWxlTmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhqb2luKHB1YmxpY0RpciwgZmlsZU5hbWUpKSkgcmV0dXJuXG4gICAgICAgIHRoaXMuZW1pdEZpbGUoeyB0eXBlOiBcImFzc2V0XCIsIGZpbGVOYW1lLCBzb3VyY2UgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJ0aWNsZXMgPSBhd2FpdCBsb2FkR2VuZXJhdGVkQXJ0aWNsZXMocm9vdClcbiAgICAgIGZvciAoY29uc3QgYXJ0aWNsZSBvZiBhcnRpY2xlcykge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gcmVzb2x2ZUluY2x1ZGVzKFxuICAgICAgICAgIGFydGljbGUuY29udGVudCxcbiAgICAgICAgICByZXNvbHZlKG9wdHMuY29uZmlnLnJvb3QsIGFydGljbGUuZmlsZSksXG4gICAgICAgIClcbiAgICAgICAgZW1pdChidWlsZFR3aW5GaWxlTmFtZShhcnRpY2xlLnBhdGgpLCByZW5kZXJNYXJrZG93blR3aW4oeyBhcnRpY2xlLCBjb250ZW50IH0pKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsbG1zID0gcmVuZGVyTGxtc1RleHQoeyBjb25maWc6IG9wdHMuY29uZmlnLCBhcnRpY2xlcyB9KVxuICAgICAgZW1pdChcImxsbXMudHh0XCIsIGxsbXMpXG4gICAgICBjb25zdCBoYXNUd2luID0gKHBhdGg6IHN0cmluZykgPT4gYXJ0aWNsZXMuc29tZShhID0+IGEucGF0aCA9PT0gcGF0aClcbiAgICAgIGlmICghaGFzVHdpbihcIi9cIikpIGVtaXQoXCJpbmRleC5tZFwiLCBsbG1zKVxuICAgICAgLy8gQSByZXdyaXRlIHRvIGEgbWlzc2luZyB0d2luIGlzIGEgNDA0LCBzbyBldmVyeSBsaXN0aW5nIHBhZ2UgbmVlZHMgb25lIHRvby5cbiAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBvcHRzLmNvbmZpZy5zZWN0aW9ucyA/PyBbXSkge1xuICAgICAgICBpZiAoc2VjdGlvbi50eXBlID09PSBcImN1c3RvbVwiIHx8IHNlY3Rpb24ucHJlZml4ID09PSBcIi9cIikgY29udGludWVcbiAgICAgICAgaWYgKGhhc1R3aW4oc2VjdGlvbi5wcmVmaXgpKSBjb250aW51ZVxuICAgICAgICBlbWl0KFxuICAgICAgICAgIGJ1aWxkVHdpbkZpbGVOYW1lKHNlY3Rpb24ucHJlZml4KSxcbiAgICAgICAgICByZW5kZXJTZWN0aW9uSW5kZXgoeyBjb25maWc6IG9wdHMuY29uZmlnLCBzZWN0aW9uLCBhcnRpY2xlcyB9KSxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IG9wdHMuY29uZmlnLnNraWxscyA/PyBbXVxuICAgICAgY29uc3Qgc2tpbGxzID0gbG9hZEFnZW50U2tpbGxzKHtcbiAgICAgICAgcm9vdDogb3B0cy5jb25maWcucm9vdCxcbiAgICAgICAgcGF0dGVybnM6IEFycmF5LmlzQXJyYXkocGF0dGVybnMpID8gcGF0dGVybnMgOiBbcGF0dGVybnNdLFxuICAgICAgfSlcbiAgICAgIGZvciAoY29uc3Qgc2tpbGwgb2Ygc2tpbGxzKSBlbWl0KGJ1aWxkU2tpbGxGaWxlTmFtZShza2lsbC5uYW1lKSwgc2tpbGwuc291cmNlKVxuICAgICAgaWYgKHNraWxscy5sZW5ndGgpIHtcbiAgICAgICAgZW1pdChcbiAgICAgICAgICBcIi53ZWxsLWtub3duL2FnZW50LXNraWxscy9pbmRleC5qc29uXCIsXG4gICAgICAgICAgcmVuZGVyU2tpbGxzSW5kZXgoeyBza2lsbHMsIGJhc2U6IG9wdHMuY29uZmlnLmJhc2UgfSksXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGVhZGVyc0ZpbGUgPSBqb2luKHB1YmxpY0RpciwgXCJfaGVhZGVyc1wiKVxuICAgICAgdGhpcy5lbWl0RmlsZSh7XG4gICAgICAgIHR5cGU6IFwiYXNzZXRcIixcbiAgICAgICAgZmlsZU5hbWU6IFwiX2hlYWRlcnNcIixcbiAgICAgICAgc291cmNlOiByZW5kZXJIZWFkZXJzKHtcbiAgICAgICAgICBiYXNlOiBvcHRzLmNvbmZpZy5iYXNlLFxuICAgICAgICAgIGhhc1NraWxsczogc2tpbGxzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgZXhpc3Rpbmc6IGV4aXN0c1N5bmMoaGVhZGVyc0ZpbGUpID8gcmVhZEZpbGVTeW5jKGhlYWRlcnNGaWxlLCBcInV0Zi04XCIpIDogXCJcIixcbiAgICAgICAgfSksXG4gICAgICB9KVxuICAgIH0sXG4gIH1cbn1cblxuLyoqIFJlbmRlciBgX2hlYWRlcnNgIChDbG91ZGZsYXJlLCBOZXRsaWZ5KTogYSBgTGlua2Agb24gdGhlIGhvbWUgcGFnZSBuYW1pbmdcbiAqICBgbGxtcy50eHRgLCBpdHMgTWFya2Rvd24gdHdpbiBhbmQgdGhlIHNraWxscyBpbmRleCwgYWZ0ZXIgYW55IHJ1bGVzIHRoZVxuICogIHByb2plY3Qgc2hpcHMgaXRzZWxmLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckhlYWRlcnMocHJvcHM6IHtcbiAgYmFzZT86IHN0cmluZ1xuICBoYXNTa2lsbHM6IGJvb2xlYW5cbiAgZXhpc3Rpbmc/OiBzdHJpbmdcbn0pIHtcbiAgY29uc3QgYmFzZSA9IHByb3BzLmJhc2UgPz8gXCJcIlxuICBjb25zdCBsaW5rcyA9IFtcbiAgICBgPCR7YmFzZX0vbGxtcy50eHQ+OyByZWw9XCJkZXNjcmliZWRieVwiOyB0eXBlPVwidGV4dC9wbGFpblwiYCxcbiAgICBgPCR7YmFzZX0vaW5kZXgubWQ+OyByZWw9XCJhbHRlcm5hdGVcIjsgdHlwZT1cInRleHQvbWFya2Rvd25cImAsXG4gIF1cbiAgaWYgKHByb3BzLmhhc1NraWxscykge1xuICAgIGxpbmtzLnB1c2goXG4gICAgICBgPCR7YmFzZX0vLndlbGwta25vd24vYWdlbnQtc2tpbGxzL2luZGV4Lmpzb24+OyByZWw9XCJkZXNjcmliZWRieVwiOyB0eXBlPVwiYXBwbGljYXRpb24vanNvblwiYCxcbiAgICApXG4gIH1cbiAgY29uc3QgcnVsZSA9IGAke2Jhc2V9L1xcbiAgTGluazogJHtsaW5rcy5qb2luKFwiLCBcIil9XFxuYFxuICBjb25zdCBleGlzdGluZyA9IHByb3BzLmV4aXN0aW5nPy50cmltRW5kKClcbiAgcmV0dXJuIGV4aXN0aW5nID8gYCR7ZXhpc3Rpbmd9XFxuXFxuJHtydWxlfWAgOiBydWxlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRHZW5lcmF0ZWRBcnRpY2xlcyhyb290OiBzdHJpbmcpIHtcbiAgY29uc3QgZmlsZSA9IGpvaW4ocm9vdCwgXCIuY29udGVudC1jb2xsZWN0aW9uc1wiLCBcImdlbmVyYXRlZFwiLCBcImFsbEFydGljbGVzLmpzXCIpXG4gIGNvbnN0IG1vZHVsZTogeyBkZWZhdWx0OiB1bmtub3duIH0gPSBhd2FpdCBpbXBvcnQocGF0aFRvRmlsZVVSTChmaWxlKS5ocmVmKVxuICByZXR1cm4gR2VuZXJhdGVkQXJ0aWNsZXMucGFyc2UobW9kdWxlLmRlZmF1bHQpXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
2
|
+
import { renderHeaders } from "./vite-agents.js";
|
|
3
|
+
describe("renderHeaders", () => {
|
|
4
|
+
it("links the home page to llms.txt and its markdown twin", () => {
|
|
5
|
+
expect(renderHeaders({ hasSkills: false })).toBe('/\n Link: </llms.txt>; rel="describedby"; type="text/plain", </index.md>; rel="alternate"; type="text/markdown"\n');
|
|
6
|
+
});
|
|
7
|
+
it("adds the skills index and mounts everything under base", () => {
|
|
8
|
+
const headers = renderHeaders({ base: "/repo", hasSkills: true });
|
|
9
|
+
expect(headers.startsWith("/repo/\n Link: </repo/llms.txt>")).toBe(true);
|
|
10
|
+
expect(headers).toContain('</repo/.well-known/agent-skills/index.json>; rel="describedby"; type="application/json"');
|
|
11
|
+
});
|
|
12
|
+
it("keeps the project's own rules ahead of the generated one", () => {
|
|
13
|
+
const headers = renderHeaders({
|
|
14
|
+
hasSkills: false,
|
|
15
|
+
existing: "/*\n X-Frame-Options: DENY\n\n",
|
|
16
|
+
});
|
|
17
|
+
expect(headers.startsWith("/*\n X-Frame-Options: DENY\n\n/\n Link: ")).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1hZ2VudHMudW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtYWdlbnRzLnVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRWhELFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxHQUFHLEVBQUU7UUFDL0QsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM5QyxvSEFBb0gsQ0FDckgsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLEdBQUcsRUFBRTtRQUNoRSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FDdkIseUZBQXlGLENBQzFGLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxHQUFHLEVBQUU7UUFDbEUsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO1lBQzVCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFFBQVEsRUFBRSxpQ0FBaUM7U0FDNUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsNENBQTRDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNyRixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHsgcmVuZGVySGVhZGVycyB9IGZyb20gXCIuL3ZpdGUtYWdlbnRzLnRzXCJcblxuZGVzY3JpYmUoXCJyZW5kZXJIZWFkZXJzXCIsICgpID0+IHtcbiAgaXQoXCJsaW5rcyB0aGUgaG9tZSBwYWdlIHRvIGxsbXMudHh0IGFuZCBpdHMgbWFya2Rvd24gdHdpblwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbmRlckhlYWRlcnMoeyBoYXNTa2lsbHM6IGZhbHNlIH0pKS50b0JlKFxuICAgICAgJy9cXG4gIExpbms6IDwvbGxtcy50eHQ+OyByZWw9XCJkZXNjcmliZWRieVwiOyB0eXBlPVwidGV4dC9wbGFpblwiLCA8L2luZGV4Lm1kPjsgcmVsPVwiYWx0ZXJuYXRlXCI7IHR5cGU9XCJ0ZXh0L21hcmtkb3duXCJcXG4nLFxuICAgIClcbiAgfSlcblxuICBpdChcImFkZHMgdGhlIHNraWxscyBpbmRleCBhbmQgbW91bnRzIGV2ZXJ5dGhpbmcgdW5kZXIgYmFzZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlbmRlckhlYWRlcnMoeyBiYXNlOiBcIi9yZXBvXCIsIGhhc1NraWxsczogdHJ1ZSB9KVxuICAgIGV4cGVjdChoZWFkZXJzLnN0YXJ0c1dpdGgoXCIvcmVwby9cXG4gIExpbms6IDwvcmVwby9sbG1zLnR4dD5cIikpLnRvQmUodHJ1ZSlcbiAgICBleHBlY3QoaGVhZGVycykudG9Db250YWluKFxuICAgICAgJzwvcmVwby8ud2VsbC1rbm93bi9hZ2VudC1za2lsbHMvaW5kZXguanNvbj47IHJlbD1cImRlc2NyaWJlZGJ5XCI7IHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCInLFxuICAgIClcbiAgfSlcblxuICBpdChcImtlZXBzIHRoZSBwcm9qZWN0J3Mgb3duIHJ1bGVzIGFoZWFkIG9mIHRoZSBnZW5lcmF0ZWQgb25lXCIsICgpID0+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVuZGVySGVhZGVycyh7XG4gICAgICBoYXNTa2lsbHM6IGZhbHNlLFxuICAgICAgZXhpc3Rpbmc6IFwiLypcXG4gIFgtRnJhbWUtT3B0aW9uczogREVOWVxcblxcblwiLFxuICAgIH0pXG4gICAgZXhwZWN0KGhlYWRlcnMuc3RhcnRzV2l0aChcIi8qXFxuICBYLUZyYW1lLU9wdGlvbnM6IERFTllcXG5cXG4vXFxuICBMaW5rOiBcIikpLnRvQmUodHJ1ZSlcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Plugin } from "vite";
|
|
2
|
-
import type { Config } from "../models/config.ts";
|
|
2
|
+
import type { Config, ContentSignals } from "../models/config.ts";
|
|
3
3
|
export interface RobotsOptions {
|
|
4
4
|
config: Config;
|
|
5
5
|
}
|
|
@@ -14,4 +14,6 @@ export declare function robots(opts: RobotsOptions): Plugin;
|
|
|
14
14
|
* line is appended only when `site` is set, because the directive
|
|
15
15
|
* requires a fully-qualified URL; `base` is included so the URL matches
|
|
16
16
|
* where the build (and the `sitemap.xml` inside it) is actually mounted. */
|
|
17
|
-
export declare function renderRobots(config: Pick<Config, "site" | "base">
|
|
17
|
+
export declare function renderRobots(config: Pick<Config, "site" | "base"> & {
|
|
18
|
+
contentSignals?: ContentSignals;
|
|
19
|
+
}): string;
|
|
@@ -29,7 +29,11 @@ export function robots(opts) {
|
|
|
29
29
|
* requires a fully-qualified URL; `base` is included so the URL matches
|
|
30
30
|
* where the build (and the `sitemap.xml` inside it) is actually mounted. */
|
|
31
31
|
export function renderRobots(config) {
|
|
32
|
-
const lines = ["User-agent: *"
|
|
32
|
+
const lines = ["User-agent: *"];
|
|
33
|
+
// Agents read the signal as part of a user-agent group, so it must sit inside one.
|
|
34
|
+
if (config.contentSignals)
|
|
35
|
+
lines.push(renderContentSignal(config.contentSignals));
|
|
36
|
+
lines.push("Allow: /");
|
|
33
37
|
if (config.site) {
|
|
34
38
|
const host = config.site.replace(/\/+$/, "");
|
|
35
39
|
const base = config.base ?? "";
|
|
@@ -37,4 +41,13 @@ export function renderRobots(config) {
|
|
|
37
41
|
}
|
|
38
42
|
return `${lines.join("\n")}\n`;
|
|
39
43
|
}
|
|
40
|
-
|
|
44
|
+
function renderContentSignal(signals) {
|
|
45
|
+
const flag = (value) => (value ? "yes" : "no");
|
|
46
|
+
const pairs = [
|
|
47
|
+
`search=${flag(signals.search)}`,
|
|
48
|
+
`ai-input=${flag(signals.aiInput)}`,
|
|
49
|
+
`ai-train=${flag(signals.aiTrain)}`,
|
|
50
|
+
];
|
|
51
|
+
return `Content-Signal: ${pairs.join(", ")}`;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1yb2JvdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvcGx1Z2lucy92aXRlLXJvYm90cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFRaEM7Ozs7O29FQUtvRTtBQUNwRSxNQUFNLFVBQVUsTUFBTSxDQUFDLElBQW1CO0lBQ3hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFBO0lBQ2hGLE9BQU87UUFDTCxJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLGtCQUFrQixDQUFDLEdBQUc7WUFDcEIsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQTtRQUM5QixDQUFDO1FBQ0QsY0FBYztZQUNaLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQztnQkFBRSxPQUFNO1lBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLE1BQU0sRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNsQyxDQUFDLENBQUE7UUFDSixDQUFDO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRDs7OzZFQUc2RTtBQUM3RSxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUEyRTtJQUUzRSxNQUFNLEtBQUssR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQy9CLG1GQUFtRjtJQUNuRixJQUFJLE1BQU0sQ0FBQyxjQUFjO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQTtJQUNqRixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3RCLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxZQUFZLElBQUksR0FBRyxJQUFJLGNBQWMsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFDRCxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO0FBQ2hDLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE9BQXVCO0lBQ2xELE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN2RCxNQUFNLEtBQUssR0FBRztRQUNaLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNoQyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDbkMsWUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0tBQ3BDLENBQUE7SUFDRCxPQUFPLG1CQUFtQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUE7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnLCBDb250ZW50U2lnbmFscyB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBSb2JvdHNPcHRpb25zIHtcbiAgY29uZmlnOiBDb25maWdcbn1cblxuLyoqIEVtaXQgYSBkZWZhdWx0IGByb2JvdHMudHh0YCBpbnRvIHRoZSBjbGllbnQgYnVpbGQgb3V0cHV0LCB3aXRoIGFcbiAqICBgU2l0ZW1hcDpgIGxpbmUgcG9pbnRpbmcgYXQgdGhlIFRhblN0YWNrLVN0YXJ0LWdlbmVyYXRlZCBgc2l0ZW1hcC54bWxgXG4gKiAgd2hlbiB7QGxpbmsgQ29uZmlnLnNpdGV9IGlzIHNldC4gU2tpcHBlZCB3aGVuIHRoZSBjb25zdW1lciBzaGlwc1xuICogIHRoZWlyIG93biBgLmxpdmVtYXJrL3B1YmxpYy9yb2JvdHMudHh0YCBzbyB0aGUgc3RhbmRhcmQgcHVibGljRGlyXG4gKiAgb3ZlcmxheSB3aW5zIOKAlCBWaXRlIGNvcGllcyB0aGUgcHVibGljRGlyIGJlZm9yZSB3cml0ZUJ1bmRsZSwgc29cbiAqICB1bmNvbmRpdGlvbmFsIGVtaXRGaWxlIHdvdWxkIHNpbGVudGx5IG92ZXJ3cml0ZSB0aGUgb3ZlcnJpZGUuICovXG5leHBvcnQgZnVuY3Rpb24gcm9ib3RzKG9wdHM6IFJvYm90c09wdGlvbnMpOiBQbHVnaW4ge1xuICBjb25zdCBvdmVycmlkZUZpbGUgPSBqb2luKG9wdHMuY29uZmlnLnJvb3QsIFwiLmxpdmVtYXJrXCIsIFwicHVibGljXCIsIFwicm9ib3RzLnR4dFwiKVxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwibGl2ZW1hcms6cm9ib3RzXCIsXG4gICAgYXBwbHlUb0Vudmlyb25tZW50KGVudikge1xuICAgICAgcmV0dXJuIGVudi5uYW1lID09PSBcImNsaWVudFwiXG4gICAgfSxcbiAgICBnZW5lcmF0ZUJ1bmRsZSgpIHtcbiAgICAgIGlmIChleGlzdHNTeW5jKG92ZXJyaWRlRmlsZSkpIHJldHVyblxuICAgICAgdGhpcy5lbWl0RmlsZSh7XG4gICAgICAgIHR5cGU6IFwiYXNzZXRcIixcbiAgICAgICAgZmlsZU5hbWU6IFwicm9ib3RzLnR4dFwiLFxuICAgICAgICBzb3VyY2U6IHJlbmRlclJvYm90cyhvcHRzLmNvbmZpZyksXG4gICAgICB9KVxuICAgIH0sXG4gIH1cbn1cblxuLyoqIFJlbmRlciB0aGUgYm9keSBvZiBhIHBlcm1pc3NpdmUgZGVmYXVsdCBgcm9ib3RzLnR4dGAuIEEgYFNpdGVtYXA6YFxuICogIGxpbmUgaXMgYXBwZW5kZWQgb25seSB3aGVuIGBzaXRlYCBpcyBzZXQsIGJlY2F1c2UgdGhlIGRpcmVjdGl2ZVxuICogIHJlcXVpcmVzIGEgZnVsbHktcXVhbGlmaWVkIFVSTDsgYGJhc2VgIGlzIGluY2x1ZGVkIHNvIHRoZSBVUkwgbWF0Y2hlc1xuICogIHdoZXJlIHRoZSBidWlsZCAoYW5kIHRoZSBgc2l0ZW1hcC54bWxgIGluc2lkZSBpdCkgaXMgYWN0dWFsbHkgbW91bnRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJSb2JvdHMoXG4gIGNvbmZpZzogUGljazxDb25maWcsIFwic2l0ZVwiIHwgXCJiYXNlXCI+ICYgeyBjb250ZW50U2lnbmFscz86IENvbnRlbnRTaWduYWxzIH0sXG4pIHtcbiAgY29uc3QgbGluZXMgPSBbXCJVc2VyLWFnZW50OiAqXCJdXG4gIC8vIEFnZW50cyByZWFkIHRoZSBzaWduYWwgYXMgcGFydCBvZiBhIHVzZXItYWdlbnQgZ3JvdXAsIHNvIGl0IG11c3Qgc2l0IGluc2lkZSBvbmUuXG4gIGlmIChjb25maWcuY29udGVudFNpZ25hbHMpIGxpbmVzLnB1c2gocmVuZGVyQ29udGVudFNpZ25hbChjb25maWcuY29udGVudFNpZ25hbHMpKVxuICBsaW5lcy5wdXNoKFwiQWxsb3c6IC9cIilcbiAgaWYgKGNvbmZpZy5zaXRlKSB7XG4gICAgY29uc3QgaG9zdCA9IGNvbmZpZy5zaXRlLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICBjb25zdCBiYXNlID0gY29uZmlnLmJhc2UgPz8gXCJcIlxuICAgIGxpbmVzLnB1c2goXCJcIiwgYFNpdGVtYXA6ICR7aG9zdH0ke2Jhc2V9L3NpdGVtYXAueG1sYClcbiAgfVxuICByZXR1cm4gYCR7bGluZXMuam9pbihcIlxcblwiKX1cXG5gXG59XG5cbmZ1bmN0aW9uIHJlbmRlckNvbnRlbnRTaWduYWwoc2lnbmFsczogQ29udGVudFNpZ25hbHMpIHtcbiAgY29uc3QgZmxhZyA9ICh2YWx1ZTogYm9vbGVhbikgPT4gKHZhbHVlID8gXCJ5ZXNcIiA6IFwibm9cIilcbiAgY29uc3QgcGFpcnMgPSBbXG4gICAgYHNlYXJjaD0ke2ZsYWcoc2lnbmFscy5zZWFyY2gpfWAsXG4gICAgYGFpLWlucHV0PSR7ZmxhZyhzaWduYWxzLmFpSW5wdXQpfWAsXG4gICAgYGFpLXRyYWluPSR7ZmxhZyhzaWduYWxzLmFpVHJhaW4pfWAsXG4gIF1cbiAgcmV0dXJuIGBDb250ZW50LVNpZ25hbDogJHtwYWlycy5qb2luKFwiLCBcIil9YFxufVxuIl19
|
|
@@ -16,5 +16,9 @@ describe("renderRobots", () => {
|
|
|
16
16
|
it("ignores base when site is not set", () => {
|
|
17
17
|
expect(renderRobots({ base: "/repo" })).toBe("User-agent: *\nAllow: /\n");
|
|
18
18
|
});
|
|
19
|
+
it("puts the content signals inside the wildcard group", () => {
|
|
20
|
+
const contentSignals = { search: true, aiInput: true, aiTrain: false };
|
|
21
|
+
expect(renderRobots({ contentSignals })).toBe("User-agent: *\nContent-Signal: search=yes, ai-input=yes, ai-train=no\nAllow: /\n");
|
|
22
|
+
});
|
|
19
23
|
});
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1yb2JvdHMudW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtcm9ib3RzLnVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRS9DLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO0lBQzVCLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7UUFDdEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO0lBQzVELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEdBQUcsRUFBRTtRQUNqRCxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDekQsd0VBQXdFLENBQ3pFLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxHQUFHLEVBQUU7UUFDcEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzFELHdFQUF3RSxDQUN6RSxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1FBQ25FLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzFFLCtFQUErRSxDQUNoRixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsbUNBQW1DLEVBQUUsR0FBRyxFQUFFO1FBQzNDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO0lBQzNFLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLGNBQWMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUE7UUFDdEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzNDLGtGQUFrRixDQUNuRixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGUtcGx1cy90ZXN0XCJcbmltcG9ydCB7IHJlbmRlclJvYm90cyB9IGZyb20gXCIuL3ZpdGUtcm9ib3RzLnRzXCJcblxuZGVzY3JpYmUoXCJyZW5kZXJSb2JvdHNcIiwgKCkgPT4ge1xuICBpdChcImVtaXRzIGFuIGFsbG93LWFsbCBib2R5IHdoZW4gc2l0ZSBpcyBub3Qgc2V0XCIsICgpID0+IHtcbiAgICBleHBlY3QocmVuZGVyUm9ib3RzKHt9KSkudG9CZShcIlVzZXItYWdlbnQ6ICpcXG5BbGxvdzogL1xcblwiKVxuICB9KVxuXG4gIGl0KFwiYXBwZW5kcyBhIFNpdGVtYXAgbGluZSB3aGVuIHNpdGUgaXMgc2V0XCIsICgpID0+IHtcbiAgICBleHBlY3QocmVuZGVyUm9ib3RzKHsgc2l0ZTogXCJodHRwczovL2xpdmVtYXJrLmRldlwiIH0pKS50b0JlKFxuICAgICAgXCJVc2VyLWFnZW50OiAqXFxuQWxsb3c6IC9cXG5cXG5TaXRlbWFwOiBodHRwczovL2xpdmVtYXJrLmRldi9zaXRlbWFwLnhtbFxcblwiLFxuICAgIClcbiAgfSlcblxuICBpdChcInN0cmlwcyBhIHRyYWlsaW5nIHNsYXNoIGZyb20gc2l0ZSBiZWZvcmUgY29tcG9zaW5nIHRoZSBVUkxcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZW5kZXJSb2JvdHMoeyBzaXRlOiBcImh0dHBzOi8vbGl2ZW1hcmsuZGV2L1wiIH0pKS50b0JlKFxuICAgICAgXCJVc2VyLWFnZW50OiAqXFxuQWxsb3c6IC9cXG5cXG5TaXRlbWFwOiBodHRwczovL2xpdmVtYXJrLmRldi9zaXRlbWFwLnhtbFxcblwiLFxuICAgIClcbiAgfSlcblxuICBpdChcImluY2x1ZGVzIHRoZSBiYXNlIHBhdGggc28gdGhlIFVSTCBtYXRjaGVzIHRoZSBidWlsZCBtb3VudFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbmRlclJvYm90cyh7IHNpdGU6IFwiaHR0cHM6Ly91c2VyLmdpdGh1Yi5pb1wiLCBiYXNlOiBcIi9yZXBvXCIgfSkpLnRvQmUoXG4gICAgICBcIlVzZXItYWdlbnQ6ICpcXG5BbGxvdzogL1xcblxcblNpdGVtYXA6IGh0dHBzOi8vdXNlci5naXRodWIuaW8vcmVwby9zaXRlbWFwLnhtbFxcblwiLFxuICAgIClcbiAgfSlcblxuICBpdChcImlnbm9yZXMgYmFzZSB3aGVuIHNpdGUgaXMgbm90IHNldFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbmRlclJvYm90cyh7IGJhc2U6IFwiL3JlcG9cIiB9KSkudG9CZShcIlVzZXItYWdlbnQ6ICpcXG5BbGxvdzogL1xcblwiKVxuICB9KVxuXG4gIGl0KFwicHV0cyB0aGUgY29udGVudCBzaWduYWxzIGluc2lkZSB0aGUgd2lsZGNhcmQgZ3JvdXBcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRTaWduYWxzID0geyBzZWFyY2g6IHRydWUsIGFpSW5wdXQ6IHRydWUsIGFpVHJhaW46IGZhbHNlIH1cbiAgICBleHBlY3QocmVuZGVyUm9ib3RzKHsgY29udGVudFNpZ25hbHMgfSkpLnRvQmUoXG4gICAgICBcIlVzZXItYWdlbnQ6ICpcXG5Db250ZW50LVNpZ25hbDogc2VhcmNoPXllcywgYWktaW5wdXQ9eWVzLCBhaS10cmFpbj1ub1xcbkFsbG93OiAvXFxuXCIsXG4gICAgKVxuICB9KVxufSlcbiJdfQ==
|