livemark 0.20.0 → 0.22.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/components/SidebarPosts.js +4 -4
- package/build/helpers/rss.d.ts +21 -0
- package/build/helpers/rss.js +56 -0
- package/build/helpers/rss.unit.d.ts +1 -0
- package/build/helpers/rss.unit.js +123 -0
- package/build/plugins/vite-robots.d.ts +17 -0
- package/build/plugins/vite-robots.js +40 -0
- package/build/plugins/vite-robots.unit.d.ts +1 -0
- package/build/plugins/vite-robots.unit.js +20 -0
- package/build/routeTree.gen.d.ts +16 -3
- package/build/routeTree.gen.js +8 -1
- package/build/routes/$section.rss[.]xml.d.ts +7 -0
- package/build/routes/$section.rss[.]xml.js +56 -0
- package/build/routes/__root.js +12 -1
- package/build/vite.config.js +19 -2
- package/package.json +14 -15
- package/source/components/SidebarPosts.tsx +12 -6
- package/source/helpers/rss.ts +80 -0
- package/source/helpers/rss.unit.ts +134 -0
- package/source/plugins/vite-robots.ts +51 -0
- package/source/plugins/vite-robots.unit.ts +32 -0
- package/source/routeTree.gen.ts +21 -3
- package/source/routes/$section.rss[.]xml.tsx +60 -0
- package/source/routes/__root.tsx +11 -0
- package/source/vite.config.ts +19 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { config } from "livemark:virtual";
|
|
2
3
|
import { Link, useLocation } from "@tanstack/react-router";
|
|
3
4
|
import { Clock, List, Rss, Tag } from "lucide-react";
|
|
4
5
|
import { currentSection, sectionFlatArticles, sortedArticles, } from "../content/article.js";
|
|
@@ -36,10 +37,9 @@ export function SidebarPosts() {
|
|
|
36
37
|
_splat: post.path.replace(/^\/|\/$/g, ""),
|
|
37
38
|
} }), children: _jsx("span", { children: post.title }) }) }, post.path));
|
|
38
39
|
}) })
|
|
39
|
-
] }), _jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { className: "opacity-75", children: [
|
|
40
|
+
] }), config.site && (_jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { className: "opacity-75", render: _jsx("a", { href: `/${sectionPath}/rss.xml` }), children: [
|
|
40
41
|
_jsx(Rss, { className: "size-4" }), _jsx("span", { children: "RSS Feed" })
|
|
41
|
-
] }) })
|
|
42
|
-
] }) })
|
|
42
|
+
] }) }))] }) })
|
|
43
43
|
] }), tags.length > 0 && (_jsxs(SidebarGroup, { children: [
|
|
44
44
|
_jsx(SidebarGroupLabel, { className: "uppercase font-mono text-xs tracking-widest", children: "Tags" }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: tags.map(tag => {
|
|
45
45
|
const tagPath = `${sectionPath}/tags/${tag}`;
|
|
@@ -50,4 +50,4 @@ export function SidebarPosts() {
|
|
|
50
50
|
}) }) })
|
|
51
51
|
] }))] }));
|
|
52
52
|
}
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lkZWJhclBvc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvU2lkZWJhclBvc3RzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3BELE9BQU8sRUFDTCxjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLGNBQWMsR0FDZixNQUFNLHVCQUF1QixDQUFBO0FBQzlCLE9BQU8sRUFDTCxZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLHdCQUF5QixDQUFBO0FBRWhDLGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsWUFBWTtJQUMxQixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUV6RCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDdkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUMzRSxNQUFNLEtBQUssR0FBRyxJQUFJO1NBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMs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QUNNO29CQUNULEVBRWQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FDbEIsTUFBQyxZQUFZO29CQUNYLEtBQUMsaUJBQWlCLElBQUMsU0FBUyxFQUFDLDZDQUE2QyxxQkFFdEQsRUFDcEIsS0FBQyxtQkFBbUIsY0FDbEIsS0FBQyxXQUFXLGNBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQ0FDZCxNQUFNLE9BQU8sR0FBRyxHQUFHLFdBQVcsU0FBUyxHQUFHLEVBQUUsQ0FBQTtnQ0FDNUMsTUFBTSxTQUFTLEdBQUcsVUFBVSxLQUFLLElBQUksT0FBTyxHQUFHLENBQUE7Z0NBQy9DLE9BQU8sQ0FDTCxLQUFDLGVBQWUsY0FDZCxNQUFDLGlCQUFpQixJQUNoQixRQUFRLEVBQUUsU0FBUyxFQUNuQixTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFDeEMsTUFBTSxFQUFFLEtBQUMsSUFBSSxJQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFJOzRDQUVyRCxLQUFDLEdBQUcsSUFBQyxTQUFTLEVBQUMsVUFBVSxHQUFHLEVBQzVCLHlCQUFPLEdBQUcsR0FBUTs0Q0FDQSxJQVJBLEdBQUcsQ0FTUCxDQUNuQixDQUFBOzRCQUNILENBQUMsQ0FBQyxHQUNVLEdBQ007b0JBQ1QsQ0FDaEIsSUFDQSxDQUNKLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGluaywgdXNlTG9jYXRpb24gfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiXG5pbXBvcnQgeyBDbG9jaywgTGlzdCwgUnNzLCBUYWcgfSBmcm9tIFwibHVjaWRlLXJlYWN0XCJcbmltcG9ydCB7XG4gIGN1cnJlbnRTZWN0aW9uLFxuICBzZWN0aW9uRmxhdEFydGljbGVzLFxuICBzb3J0ZWRBcnRpY2xlcyxcbn0gZnJvbSBcIi4uL2NvbnRlbnQvYXJ0aWNsZS50c1wiXG5pbXBvcnQge1xuICBTaWRlYmFyR3JvdXAsXG4gIFNpZGViYXJHcm91cENvbnRlbnQsXG4gIFNpZGViYXJHcm91cExhYmVsLFxuICBTaWRlYmFyTWVudSxcbiAgU2lkZWJhck1lbnVCdXR0b24sXG4gIFNpZGViYXJNZW51SXRlbSxcbiAgU2lkZWJhck1lbnVTdWIsXG4gIFNpZGViYXJNZW51U3ViQnV0dG9uLFxuICBTaWRlYmFyTWVudVN1Ykl0ZW0sXG59IGZyb20gXCIuLi9lbGVtZW50cy9zaWRlYmFyLnRzeFwiXG5cbi8qKiBCbG9nIGJvZHkgc2xvdCBmb3IgdGhlIFNpZGViYXIgc2hlbGw6IEFsbCBQb3N0cyAvIFJlY2VudCBQb3N0cyAvIFJTUyAvIFRhZ3MgKi9cbmV4cG9ydCBmdW5jdGlvbiBTaWRlYmFyUG9zdHMoKSB7XG4gIGNvbnN0IHBhdGhuYW1lID0gdXNlTG9jYXRpb24oeyBzZWxlY3Q6IGwgPT4gbC5wYXRobmFtZSB9KVxuXG4gIGNvbnN0IHNlY3Rpb24gPSBjdXJyZW50U2VjdGlvbihgLyR7cGF0aG5hbWUucmVwbGFjZSgvXlxcL3xcXC8kL2csIFwiXCIpfS9gKVxuICBjb25zdCBmbGF0ID0gc2VjdGlvbiA/IChzZWN0aW9uRmxhdEFydGljbGVzLmdldChzZWN0aW9uLnByZWZpeCkgPz8gW10pIDogW11cbiAgY29uc3QgcG9zdHMgPSBmbGF0XG4gICAgLm1hcChwID0+IHNvcnRlZEFydGljbGVzLmZpbmQoYSA9PiBhLnBhdGggPT09IHApKVxuICAgIC5maWx0ZXIoYSA9PiBhICE9PSB1bmRlZmluZWQpXG4gIGNvbnN0IHJlY2VudFBvc3RzID0gcG9zdHMuc2xpY2UoMCwgNSlcblxuICBjb25zdCBhbGxUYWdzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgZm9yIChjb25zdCBwb3N0IG9mIHBvc3RzKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgcG9zdC50YWdzID8/IFtdKSB7XG4gICAgICBhbGxUYWdzLmFkZCh0YWcpXG4gICAgfVxuICB9XG4gIGNvbnN0IHRhZ3MgPSBbLi4uYWxsVGFnc10uc29ydCgpXG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IGAvJHtwYXRobmFtZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIil9L2BcbiAgY29uc3QgaXNJbmRleCA9IHNlY3Rpb24gPyBub3JtYWxpemVkID09PSBzZWN0aW9uLnByZWZpeCA6IGZhbHNlXG4gIGNvbnN0IHNlY3Rpb25QYXRoID0gKHNlY3Rpb24/LnByZWZpeCA/PyBcIi9ibG9nL1wiKS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIilcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8U2lkZWJhckdyb3VwPlxuICAgICAgICA8U2lkZWJhckdyb3VwTGFiZWwgY2xhc3NOYW1lPVwidXBwZXJjYXNlIGZvbnQtbW9ubyB0ZXh0LXhzIHRyYWNraW5nLXdpZGVzdFwiPlxuICAgICAgICAgIFBvc3RzXG4gICAgICAgIDwvU2lkZWJhckdyb3VwTGFiZWw+XG4gICAgICAgIDxTaWRlYmFyR3JvdXBDb250ZW50PlxuICAgICAgICAgIDxTaWRlYmFyTWVudT5cbiAgICAgICAgICAgIDxTaWRlYmFyTWVudUl0ZW0+XG4gICAgICAgICAgICAgIDxTaWRlYmFyTWVudUJ1dHRvblxuICAgICAgICAgICAgICAgIGlzQWN0aXZlPXtpc0luZGV4fVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17aXNJbmRleCA/IFwiXCIgOiBcIm9wYWNpdHktNzVcIn1cbiAgICAgICAgICAgICAgICByZW5kZXI9ezxMaW5rIHRvPVwiLyRcIiBwYXJhbXM9e3sgX3NwbGF0OiBzZWN0aW9uUGF0aCB9fSAvPn1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxMaXN0IGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+QWxsIFBvc3RzPC9zcGFuPlxuICAgICAgICAgICAgICA8L1NpZGViYXJNZW51QnV0dG9uPlxuICAgICAgICAgICAgPC9TaWRlYmFyTWVudUl0ZW0+XG4gICAgICAgICAgICA8U2lkZWJhck1lbnVJdGVtPlxuICAgICAgICAgICAgICA8U2lkZWJhck1lbnVCdXR0b24gY2xhc3NOYW1lPVwib3BhY2l0eS03NVwiPlxuICAgICAgICAgICAgICAgIDxDbG9jayBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPlJlY2VudCBQb3N0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9TaWRlYmFyTWVudUJ1dHRvbj5cbiAgICAgICAgICAgICAgPFNpZGViYXJNZW51U3ViPlxuICAgICAgICAgICAgICAgIHtyZWNlbnRQb3N0cy5tYXAocG9zdCA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmUgPSBub3JtYWxpemVkID09PSBwb3N0LnBhdGhcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxTaWRlYmFyTWVudVN1Ykl0ZW0ga2V5PXtwb3N0LnBhdGh9PlxuICAgICAgICAgICAgICAgICAgICAgIDxTaWRlYmFyTWVudVN1YkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU9e2FjdGl2ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YWN0aXZlID8gXCJcIiA6IFwib3BhY2l0eS03NVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bz1cIi8kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zcGxhdDogcG9zdC5wYXRoLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPntwb3N0LnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NpZGViYXJNZW51U3ViQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L1NpZGViYXJNZW51U3ViSXRlbT5cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9TaWRlYmFyTWVudVN1Yj5cbiAgICAgICAgICAgIDwvU2lkZWJhck1lbnVJdGVtPlxuICAgICAgICAgICAgPFNpZGViYXJNZW51SXRlbT5cbiAgICAgICAgICAgICAgPFNpZGViYXJNZW51QnV0dG9uIGNsYXNzTmFtZT1cIm9wYWNpdHktNzVcIj5cbiAgICAgICAgICAgICAgICA8UnNzIGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+UlNTIEZlZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVCdXR0b24+XG4gICAgICAgICAgICA8L1NpZGViYXJNZW51SXRlbT5cbiAgICAgICAgICA8L1NpZGViYXJNZW51PlxuICAgICAgICA8L1NpZGViYXJHcm91cENvbnRlbnQ+XG4gICAgICA8L1NpZGViYXJHcm91cD5cblxuICAgICAge3RhZ3MubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxTaWRlYmFyR3JvdXA+XG4gICAgICAgICAgPFNpZGViYXJHcm91cExhYmVsIGNsYXNzTmFtZT1cInVwcGVyY2FzZSBmb250LW1vbm8gdGV4dC14cyB0cmFja2luZy13aWRlc3RcIj5cbiAgICAgICAgICAgIFRhZ3NcbiAgICAgICAgICA8L1NpZGViYXJHcm91cExhYmVsPlxuICAgICAgICAgIDxTaWRlYmFyR3JvdXBDb250ZW50PlxuICAgICAgICAgICAgPFNpZGViYXJNZW51PlxuICAgICAgICAgICAgICB7dGFncy5tYXAodGFnID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdQYXRoID0gYCR7c2VjdGlvblBhdGh9L3RhZ3MvJHt0YWd9YFxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ0FjdGl2ZSA9IG5vcm1hbGl6ZWQgPT09IGAvJHt0YWdQYXRofS9gXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxTaWRlYmFyTWVudUl0ZW0ga2V5PXt0YWd9PlxuICAgICAgICAgICAgICAgICAgICA8U2lkZWJhck1lbnVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17dGFnQWN0aXZlfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17dGFnQWN0aXZlID8gXCJcIiA6IFwib3BhY2l0eS03NVwifVxuICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcj17PExpbmsgdG89XCIvJFwiIHBhcmFtcz17eyBfc3BsYXQ6IHRhZ1BhdGggfX0gLz59XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8VGFnIGNsYXNzTmFtZT1cInNpemUtMy41XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57dGFnfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9TaWRlYmFyTWVudUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVJdGVtPlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L1NpZGViYXJNZW51PlxuICAgICAgICAgIDwvU2lkZWJhckdyb3VwQ29udGVudD5cbiAgICAgICAgPC9TaWRlYmFyR3JvdXA+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG4iXX0=
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lkZWJhclBvc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvU2lkZWJhclBvc3RzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUNwRCxPQUFPLEVBQ0wsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQTtBQUM5QixPQUFPLEVBQ0wsWUFBWSxFQUNaLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSx3QkFBeUIsQ0FBQTtBQUVoQyxrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLFlBQVk7SUFDMUIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFFekQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3ZFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDM0UsTUFBTSxLQUFLLEdBQUcsSUFBSTtTQUNmLEdBQUcsQ0FBQyxDQUFDLENB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QixNQUFNLEVBQUUsWUFBRyxJQUFJLEVBQUUsSUFBSSxXQUFXLFVBQVUsR0FBSTs0Q0FFOUMsS0FBQyxHQUFHLElBQUMsU0FBUyxFQUFDLFFBQVEsR0FBRyxFQUMxQixzQ0FBcUI7NENBQ0gsR0FDSixDQUNuQixJQUNXLEdBQ007b0JBQ1QsRUFFZCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUNsQixNQUFDLFlBQVk7b0JBQ1gsS0FBQyxpQkFBaUIsSUFBQyxTQUFTLEVBQUMsNkNBQTZDLHFCQUV0RCxFQUNwQixLQUFDLG1CQUFtQixjQUNsQixLQUFDLFdBQVcsY0FDVCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dDQUNkLE1BQU0sT0FBTyxHQUFHLEdBQUcsV0FBVyxTQUFTLEdBQUcsRUFBRSxDQUFBO2dDQUM1QyxNQUFNLFNBQVMsR0FBRyxVQUFVLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQTtnQ0FDL0MsT0FBTyxDQUNMLEtBQUMsZUFBZSxjQUNkLE1BQUMsaUJBQWlCLElBQ2hCLFFBQVEsRUFBRSxTQUFTLEVBQ25CLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUN4QyxNQUFNLEVBQUUsS0FBQyxJQUFJLElBQUMsRUFBRSxFQUFDLElBQUksRUFBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUk7NENBRXJELEtBQUMsR0FBRyxJQUFDLFNBQVMsRUFBQyxVQUFVLEdBQUcsRUFDNUIseUJBQU8sR0FBRyxHQUFROzRDQUNBLElBUkEsR0FBRyxDQVNQLENBQ25CLENBQUE7NEJBQ0gsQ0FBQyxDQUFDLEdBQ1UsR0FDTTtvQkFDVCxDQUNoQixJQUNBLENBQ0osQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25maWcgfSBmcm9tIFwibGl2ZW1hcms6dmlydHVhbFwiXG5pbXBvcnQgeyBMaW5rLCB1c2VMb2NhdGlvbiB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyXCJcbmltcG9ydCB7IENsb2NrLCBMaXN0LCBSc3MsIFRhZyB9IGZyb20gXCJsdWNpZGUtcmVhY3RcIlxuaW1wb3J0IHtcbiAgY3VycmVudFNlY3Rpb24sXG4gIHNlY3Rpb25GbGF0QXJ0aWNsZXMsXG4gIHNvcnRlZEFydGljbGVzLFxufSBmcm9tIFwiLi4vY29udGVudC9hcnRpY2xlLnRzXCJcbmltcG9ydCB7XG4gIFNpZGViYXJHcm91cCxcbiAgU2lkZWJhckdyb3VwQ29udGVudCxcbiAgU2lkZWJhckdyb3VwTGFiZWwsXG4gIFNpZGViYXJNZW51LFxuICBTaWRlYmFyTWVudUJ1dHRvbixcbiAgU2lkZWJhck1lbnVJdGVtLFxuICBTaWRlYmFyTWVudVN1YixcbiAgU2lkZWJhck1lbnVTdWJCdXR0b24sXG4gIFNpZGViYXJNZW51U3ViSXRlbSxcbn0gZnJvbSBcIi4uL2VsZW1lbnRzL3NpZGViYXIudHN4XCJcblxuLyoqIEJsb2cgYm9keSBzbG90IGZvciB0aGUgU2lkZWJhciBzaGVsbDogQWxsIFBvc3RzIC8gUmVjZW50IFBvc3RzIC8gUlNTIC8gVGFncyAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNpZGViYXJQb3N0cygpIHtcbiAgY29uc3QgcGF0aG5hbWUgPSB1c2VMb2NhdGlvbih7IHNlbGVjdDogbCA9PiBsLnBhdGhuYW1lIH0pXG5cbiAgY29uc3Qgc2VjdGlvbiA9IGN1cnJlbnRTZWN0aW9uKGAvJHtwYXRobmFtZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIil9L2ApXG4gIGNvbnN0IGZsYXQgPSBzZWN0aW9uID8gKHNlY3Rpb25GbGF0QXJ0aWNsZXMuZ2V0KHNlY3Rpb24ucHJlZml4KSA/PyBbXSkgOiBbXVxuICBjb25zdCBwb3N0cyA9IGZsYXRcbiAgICAubWFwKHAgPT4gc29ydGVkQXJ0aWNsZXMuZmluZChhID0+IGEucGF0aCA9PT0gcCkpXG4gICAgLmZpbHRlcihhID0+IGEgIT09IHVuZGVmaW5lZClcbiAgY29uc3QgcmVjZW50UG9zdHMgPSBwb3N0cy5zbGljZSgwLCA1KVxuXG4gIGNvbnN0IGFsbFRhZ3MgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBmb3IgKGNvbnN0IHBvc3Qgb2YgcG9zdHMpIHtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBwb3N0LnRhZ3MgPz8gW10pIHtcbiAgICAgIGFsbFRhZ3MuYWRkKHRhZylcbiAgICB9XG4gIH1cbiAgY29uc3QgdGFncyA9IFsuLi5hbGxUYWdzXS5zb3J0KClcblxuICBjb25zdCBub3JtYWxpemVkID0gYC8ke3BhdGhuYW1lLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKX0vYFxuICBjb25zdCBpc0luZGV4ID0gc2VjdGlvbiA/IG5vcm1hbGl6ZWQgPT09IHNlY3Rpb24ucHJlZml4IDogZmFsc2VcbiAgY29uc3Qgc2VjdGlvblBhdGggPSAoc2VjdGlvbj8ucHJlZml4ID8/IFwiL2Jsb2cvXCIpLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxTaWRlYmFyR3JvdXA+XG4gICAgICAgIDxTaWRlYmFyR3JvdXBMYWJlbCBjbGFzc05hbWU9XCJ1cHBlcmNhc2UgZm9udC1tb25vIHRleHQteHMgdHJhY2tpbmctd2lkZXN0XCI+XG4gICAgICAgICAgUG9zdHNcbiAgICAgICAgPC9TaWRlYmFyR3JvdXBMYWJlbD5cbiAgICAgICAgPFNpZGViYXJHcm91cENvbnRlbnQ+XG4gICAgICAgICAgPFNpZGViYXJNZW51PlxuICAgICAgICAgICAgPFNpZGViYXJNZW51SXRlbT5cbiAgICAgICAgICAgICAgPFNpZGViYXJNZW51QnV0dG9uXG4gICAgICAgICAgICAgICAgaXNBY3RpdmU9e2lzSW5kZXh9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpc0luZGV4ID8gXCJcIiA6IFwib3BhY2l0eS03NVwifVxuICAgICAgICAgICAgICAgIHJlbmRlcj17PExpbmsgdG89XCIvJFwiIHBhcmFtcz17eyBfc3BsYXQ6IHNlY3Rpb25QYXRoIH19IC8+fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPExpc3QgY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj5BbGwgUG9zdHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVCdXR0b24+XG4gICAgICAgICAgICA8L1NpZGViYXJNZW51SXRlbT5cbiAgICAgICAgICAgIDxTaWRlYmFyTWVudUl0ZW0+XG4gICAgICAgICAgICAgIDxTaWRlYmFyTWVudUJ1dHRvbiBjbGFzc05hbWU9XCJvcGFjaXR5LTc1XCI+XG4gICAgICAgICAgICAgICAgPENsb2NrIGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+UmVjZW50IFBvc3RzPC9zcGFuPlxuICAgICAgICAgICAgICA8L1NpZGViYXJNZW51QnV0dG9uPlxuICAgICAgICAgICAgICA8U2lkZWJhck1lbnVTdWI+XG4gICAgICAgICAgICAgICAge3JlY2VudFBvc3RzLm1hcChwb3N0ID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IG5vcm1hbGl6ZWQgPT09IHBvc3QucGF0aFxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPFNpZGViYXJNZW51U3ViSXRlbSBrZXk9e3Bvc3QucGF0aH0+XG4gICAgICAgICAgICAgICAgICAgICAgPFNpZGViYXJNZW51U3ViQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17YWN0aXZlfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXthY3RpdmUgPyBcIlwiIDogXCJvcGFjaXR5LTc1XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXI9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvPVwiLyRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcz17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NwbGF0OiBwb3N0LnBhdGgucmVwbGFjZSgvXlxcL3xcXC8kL2csIFwiXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3Bvc3QudGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVTdWJCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVTdWJJdGVtPlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L1NpZGViYXJNZW51U3ViPlxuICAgICAgICAgICAgPC9TaWRlYmFyTWVudUl0ZW0+XG4gICAgICAgICAgICB7Y29uZmlnLnNpdGUgJiYgKFxuICAgICAgICAgICAgICA8U2lkZWJhck1lbnVJdGVtPlxuICAgICAgICAgICAgICAgIDxTaWRlYmFyTWVudUJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3BhY2l0eS03NVwiXG4gICAgICAgICAgICAgICAgICByZW5kZXI9ezxhIGhyZWY9e2AvJHtzZWN0aW9uUGF0aH0vcnNzLnhtbGB9IC8+fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxSc3MgY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlJTUyBGZWVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVCdXR0b24+XG4gICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVJdGVtPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1NpZGViYXJNZW51PlxuICAgICAgICA8L1NpZGViYXJHcm91cENvbnRlbnQ+XG4gICAgICA8L1NpZGViYXJHcm91cD5cblxuICAgICAge3RhZ3MubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxTaWRlYmFyR3JvdXA+XG4gICAgICAgICAgPFNpZGViYXJHcm91cExhYmVsIGNsYXNzTmFtZT1cInVwcGVyY2FzZSBmb250LW1vbm8gdGV4dC14cyB0cmFja2luZy13aWRlc3RcIj5cbiAgICAgICAgICAgIFRhZ3NcbiAgICAgICAgICA8L1NpZGViYXJHcm91cExhYmVsPlxuICAgICAgICAgIDxTaWRlYmFyR3JvdXBDb250ZW50PlxuICAgICAgICAgICAgPFNpZGViYXJNZW51PlxuICAgICAgICAgICAgICB7dGFncy5tYXAodGFnID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdQYXRoID0gYCR7c2VjdGlvblBhdGh9L3RhZ3MvJHt0YWd9YFxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ0FjdGl2ZSA9IG5vcm1hbGl6ZWQgPT09IGAvJHt0YWdQYXRofS9gXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxTaWRlYmFyTWVudUl0ZW0ga2V5PXt0YWd9PlxuICAgICAgICAgICAgICAgICAgICA8U2lkZWJhck1lbnVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17dGFnQWN0aXZlfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17dGFnQWN0aXZlID8gXCJcIiA6IFwib3BhY2l0eS03NVwifVxuICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcj17PExpbmsgdG89XCIvJFwiIHBhcmFtcz17eyBfc3BsYXQ6IHRhZ1BhdGggfX0gLz59XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8VGFnIGNsYXNzTmFtZT1cInNpemUtMy41XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57dGFnfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9TaWRlYmFyTWVudUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVJdGVtPlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L1NpZGViYXJNZW51PlxuICAgICAgICAgIDwvU2lkZWJhckdyb3VwQ29udGVudD5cbiAgICAgICAgPC9TaWRlYmFyR3JvdXA+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface RssItem {
|
|
2
|
+
title: string;
|
|
3
|
+
link: string;
|
|
4
|
+
guid: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
pubDate?: string;
|
|
7
|
+
author?: string | string[];
|
|
8
|
+
categories?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface RssFeed {
|
|
11
|
+
title: string;
|
|
12
|
+
description: string;
|
|
13
|
+
link: string;
|
|
14
|
+
feedLink: string;
|
|
15
|
+
items: RssItem[];
|
|
16
|
+
}
|
|
17
|
+
/** Render an RSS 2.0 channel as a serialized XML document. Pure — all I/O,
|
|
18
|
+
* URL composition, and item-count limits live in the caller. `pubDate` is
|
|
19
|
+
* accepted as an ISO string (article frontmatter shape) and converted to
|
|
20
|
+
* RFC 822 here, which is what readers like NetNewsWire and Feedly parse. */
|
|
21
|
+
export declare function renderRssFeed(feed: RssFeed): string;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Render an RSS 2.0 channel as a serialized XML document. Pure — all I/O,
|
|
2
|
+
* URL composition, and item-count limits live in the caller. `pubDate` is
|
|
3
|
+
* accepted as an ISO string (article frontmatter shape) and converted to
|
|
4
|
+
* RFC 822 here, which is what readers like NetNewsWire and Feedly parse. */
|
|
5
|
+
export function renderRssFeed(feed) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
lines.push('<?xml version="1.0" encoding="UTF-8"?>');
|
|
8
|
+
lines.push('<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">');
|
|
9
|
+
lines.push(" <channel>");
|
|
10
|
+
lines.push(` <title>${escapeXml(feed.title)}</title>`);
|
|
11
|
+
lines.push(` <link>${escapeXml(feed.link)}</link>`);
|
|
12
|
+
lines.push(` <description>${escapeXml(feed.description)}</description>`);
|
|
13
|
+
lines.push(` <atom:link href="${escapeXml(feed.feedLink)}" rel="self" type="application/rss+xml" />`);
|
|
14
|
+
for (const item of feed.items) {
|
|
15
|
+
lines.push(" <item>");
|
|
16
|
+
lines.push(` <title>${escapeXml(item.title)}</title>`);
|
|
17
|
+
lines.push(` <link>${escapeXml(item.link)}</link>`);
|
|
18
|
+
lines.push(` <guid isPermaLink="true">${escapeXml(item.guid)}</guid>`);
|
|
19
|
+
if (item.description) {
|
|
20
|
+
lines.push(` <description>${escapeXml(item.description)}</description>`);
|
|
21
|
+
}
|
|
22
|
+
if (item.pubDate) {
|
|
23
|
+
lines.push(` <pubDate>${escapeXml(toRfc822(item.pubDate))}</pubDate>`);
|
|
24
|
+
}
|
|
25
|
+
if (item.author) {
|
|
26
|
+
const author = Array.isArray(item.author)
|
|
27
|
+
? item.author.join(", ")
|
|
28
|
+
: item.author;
|
|
29
|
+
lines.push(` <author>${escapeXml(author)}</author>`);
|
|
30
|
+
}
|
|
31
|
+
if (item.categories) {
|
|
32
|
+
for (const category of item.categories) {
|
|
33
|
+
lines.push(` <category>${escapeXml(category)}</category>`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
lines.push(" </item>");
|
|
37
|
+
}
|
|
38
|
+
lines.push(" </channel>");
|
|
39
|
+
lines.push("</rss>");
|
|
40
|
+
return `${lines.join("\n")}\n`;
|
|
41
|
+
}
|
|
42
|
+
function escapeXml(value) {
|
|
43
|
+
return value
|
|
44
|
+
.replace(/&/g, "&")
|
|
45
|
+
.replace(/</g, "<")
|
|
46
|
+
.replace(/>/g, ">")
|
|
47
|
+
.replace(/"/g, """)
|
|
48
|
+
.replace(/'/g, "'");
|
|
49
|
+
}
|
|
50
|
+
function toRfc822(iso) {
|
|
51
|
+
const date = new Date(iso);
|
|
52
|
+
if (Number.isNaN(date.getTime()))
|
|
53
|
+
return iso;
|
|
54
|
+
return date.toUTCString();
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvcnNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtCQTs7OzZFQUc2RTtBQUM3RSxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWE7SUFDekMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtJQUNwRCxLQUFLLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUE7SUFDMUUsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDekQsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3RELEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDM0UsS0FBSyxDQUFDLElBQUksQ0FDUix3QkFBd0IsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQzdGLENBQUE7SUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNELEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN4RCxLQUFLLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMzRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixLQUFLLENBQUMsSUFBSSxDQUNSLHNCQUFzQixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FDbEUsQ0FBQTtRQUNILENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixLQUFLLENBQUMsSUFBSSxDQUNSLGtCQUFrQixTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQ2hFLENBQUE7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQTtZQUNmLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDM0QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixTQUFTLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQ2pFLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUMzQixDQUFDO0lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3BCLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUE7QUFDaEMsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEtBQWE7SUFDOUIsT0FBTyxLQUFLO1NBQ1QsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7U0FDdEIsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7U0FDckIsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7U0FDckIsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUM7U0FDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUM1QixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsR0FBVztJQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMxQixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUE7SUFDNUMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgUnNzSXRlbSB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgbGluazogc3RyaW5nXG4gIGd1aWQ6IHN0cmluZ1xuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICBwdWJEYXRlPzogc3RyaW5nXG4gIGF1dGhvcj86IHN0cmluZyB8IHN0cmluZ1tdXG4gIGNhdGVnb3JpZXM/OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJzc0ZlZWQge1xuICB0aXRsZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgbGluazogc3RyaW5nXG4gIGZlZWRMaW5rOiBzdHJpbmdcbiAgaXRlbXM6IFJzc0l0ZW1bXVxufVxuXG4vKiogUmVuZGVyIGFuIFJTUyAyLjAgY2hhbm5lbCBhcyBhIHNlcmlhbGl6ZWQgWE1MIGRvY3VtZW50LiBQdXJlIOKAlCBhbGwgSS9PLFxuICogIFVSTCBjb21wb3NpdGlvbiwgYW5kIGl0ZW0tY291bnQgbGltaXRzIGxpdmUgaW4gdGhlIGNhbGxlci4gYHB1YkRhdGVgIGlzXG4gKiAgYWNjZXB0ZWQgYXMgYW4gSVNPIHN0cmluZyAoYXJ0aWNsZSBmcm9udG1hdHRlciBzaGFwZSkgYW5kIGNvbnZlcnRlZCB0b1xuICogIFJGQyA4MjIgaGVyZSwgd2hpY2ggaXMgd2hhdCByZWFkZXJzIGxpa2UgTmV0TmV3c1dpcmUgYW5kIEZlZWRseSBwYXJzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJSc3NGZWVkKGZlZWQ6IFJzc0ZlZWQpIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cbiAgbGluZXMucHVzaCgnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+JylcbiAgbGluZXMucHVzaCgnPHJzcyB2ZXJzaW9uPVwiMi4wXCIgeG1sbnM6YXRvbT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbVwiPicpXG4gIGxpbmVzLnB1c2goXCIgIDxjaGFubmVsPlwiKVxuICBsaW5lcy5wdXNoKGAgICAgPHRpdGxlPiR7ZXNjYXBlWG1sKGZlZWQudGl0bGUpfTwvdGl0bGU+YClcbiAgbGluZXMucHVzaChgICAgIDxsaW5rPiR7ZXNjYXBlWG1sKGZlZWQubGluayl9PC9saW5rPmApXG4gIGxpbmVzLnB1c2goYCAgICA8ZGVzY3JpcHRpb24+JHtlc2NhcGVYbWwoZmVlZC5kZXNjcmlwdGlvbil9PC9kZXNjcmlwdGlvbj5gKVxuICBsaW5lcy5wdXNoKFxuICAgIGAgICAgPGF0b206bGluayBocmVmPVwiJHtlc2NhcGVYbWwoZmVlZC5mZWVkTGluayl9XCIgcmVsPVwic2VsZlwiIHR5cGU9XCJhcHBsaWNhdGlvbi9yc3MreG1sXCIgLz5gLFxuICApXG4gIGZvciAoY29uc3QgaXRlbSBvZiBmZWVkLml0ZW1zKSB7XG4gICAgbGluZXMucHVzaChcIiAgICA8aXRlbT5cIilcbiAgICBsaW5lcy5wdXNoKGAgICAgICA8dGl0bGU+JHtlc2NhcGVYbWwoaXRlbS50aXRsZSl9PC90aXRsZT5gKVxuICAgIGxpbmVzLnB1c2goYCAgICAgIDxsaW5rPiR7ZXNjYXBlWG1sKGl0ZW0ubGluayl9PC9saW5rPmApXG4gICAgbGluZXMucHVzaChgICAgICAgPGd1aWQgaXNQZXJtYUxpbms9XCJ0cnVlXCI+JHtlc2NhcGVYbWwoaXRlbS5ndWlkKX08L2d1aWQ+YClcbiAgICBpZiAoaXRlbS5kZXNjcmlwdGlvbikge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCAgICAgIDxkZXNjcmlwdGlvbj4ke2VzY2FwZVhtbChpdGVtLmRlc2NyaXB0aW9uKX08L2Rlc2NyaXB0aW9uPmAsXG4gICAgICApXG4gICAgfVxuICAgIGlmIChpdGVtLnB1YkRhdGUpIHtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGAgICAgICA8cHViRGF0ZT4ke2VzY2FwZVhtbCh0b1JmYzgyMihpdGVtLnB1YkRhdGUpKX08L3B1YkRhdGU+YCxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKGl0ZW0uYXV0aG9yKSB7XG4gICAgICBjb25zdCBhdXRob3IgPSBBcnJheS5pc0FycmF5KGl0ZW0uYXV0aG9yKVxuICAgICAgICA/IGl0ZW0uYXV0aG9yLmpvaW4oXCIsIFwiKVxuICAgICAgICA6IGl0ZW0uYXV0aG9yXG4gICAgICBsaW5lcy5wdXNoKGAgICAgICA8YXV0aG9yPiR7ZXNjYXBlWG1sKGF1dGhvcil9PC9hdXRob3I+YClcbiAgICB9XG4gICAgaWYgKGl0ZW0uY2F0ZWdvcmllcykge1xuICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBpdGVtLmNhdGVnb3JpZXMpIHtcbiAgICAgICAgbGluZXMucHVzaChgICAgICAgPGNhdGVnb3J5PiR7ZXNjYXBlWG1sKGNhdGVnb3J5KX08L2NhdGVnb3J5PmApXG4gICAgICB9XG4gICAgfVxuICAgIGxpbmVzLnB1c2goXCIgICAgPC9pdGVtPlwiKVxuICB9XG4gIGxpbmVzLnB1c2goXCIgIDwvY2hhbm5lbD5cIilcbiAgbGluZXMucHVzaChcIjwvcnNzPlwiKVxuICByZXR1cm4gYCR7bGluZXMuam9pbihcIlxcblwiKX1cXG5gXG59XG5cbmZ1bmN0aW9uIGVzY2FwZVhtbCh2YWx1ZTogc3RyaW5nKSB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcbiAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcbiAgICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcbiAgICAucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcbiAgICAucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKVxufVxuXG5mdW5jdGlvbiB0b1JmYzgyMihpc286IHN0cmluZykge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXNvKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIGlzb1xuICByZXR1cm4gZGF0ZS50b1VUQ1N0cmluZygpXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
2
|
+
import { renderRssFeed } from "./rss.js";
|
|
3
|
+
describe("renderRssFeed", () => {
|
|
4
|
+
it("renders a minimal channel with no items", () => {
|
|
5
|
+
const xml = renderRssFeed({
|
|
6
|
+
title: "Blog",
|
|
7
|
+
description: "Latest posts",
|
|
8
|
+
link: "https://example.com/blog/",
|
|
9
|
+
feedLink: "https://example.com/blog/rss.xml",
|
|
10
|
+
items: [],
|
|
11
|
+
});
|
|
12
|
+
expect(xml).toBe(`<?xml version="1.0" encoding="UTF-8"?>
|
|
13
|
+
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
|
14
|
+
<channel>
|
|
15
|
+
<title>Blog</title>
|
|
16
|
+
<link>https://example.com/blog/</link>
|
|
17
|
+
<description>Latest posts</description>
|
|
18
|
+
<atom:link href="https://example.com/blog/rss.xml" rel="self" type="application/rss+xml" />
|
|
19
|
+
</channel>
|
|
20
|
+
</rss>
|
|
21
|
+
`);
|
|
22
|
+
});
|
|
23
|
+
it("renders an item with all optional fields", () => {
|
|
24
|
+
const xml = renderRssFeed({
|
|
25
|
+
title: "Blog",
|
|
26
|
+
description: "Latest posts",
|
|
27
|
+
link: "https://example.com/blog/",
|
|
28
|
+
feedLink: "https://example.com/blog/rss.xml",
|
|
29
|
+
items: [
|
|
30
|
+
{
|
|
31
|
+
title: "Hello",
|
|
32
|
+
link: "https://example.com/blog/hello/",
|
|
33
|
+
guid: "https://example.com/blog/hello/",
|
|
34
|
+
description: "First post",
|
|
35
|
+
pubDate: "2026-05-16T00:00:00Z",
|
|
36
|
+
author: "Jane",
|
|
37
|
+
categories: ["news"],
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
expect(xml).toContain("<title>Hello</title>");
|
|
42
|
+
expect(xml).toContain("<link>https://example.com/blog/hello/</link>");
|
|
43
|
+
expect(xml).toContain('<guid isPermaLink="true">https://example.com/blog/hello/</guid>');
|
|
44
|
+
expect(xml).toContain("<description>First post</description>");
|
|
45
|
+
expect(xml).toContain("<pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>");
|
|
46
|
+
expect(xml).toContain("<author>Jane</author>");
|
|
47
|
+
expect(xml).toContain("<category>news</category>");
|
|
48
|
+
});
|
|
49
|
+
it("joins array authors with a comma", () => {
|
|
50
|
+
const xml = renderRssFeed({
|
|
51
|
+
title: "Blog",
|
|
52
|
+
description: "",
|
|
53
|
+
link: "https://example.com/blog/",
|
|
54
|
+
feedLink: "https://example.com/blog/rss.xml",
|
|
55
|
+
items: [
|
|
56
|
+
{
|
|
57
|
+
title: "x",
|
|
58
|
+
link: "https://example.com/blog/x/",
|
|
59
|
+
guid: "https://example.com/blog/x/",
|
|
60
|
+
author: ["Alice", "Bob"],
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
expect(xml).toContain("<author>Alice, Bob</author>");
|
|
65
|
+
});
|
|
66
|
+
it("emits one <category> per tag", () => {
|
|
67
|
+
const xml = renderRssFeed({
|
|
68
|
+
title: "Blog",
|
|
69
|
+
description: "",
|
|
70
|
+
link: "https://example.com/blog/",
|
|
71
|
+
feedLink: "https://example.com/blog/rss.xml",
|
|
72
|
+
items: [
|
|
73
|
+
{
|
|
74
|
+
title: "x",
|
|
75
|
+
link: "https://example.com/blog/x/",
|
|
76
|
+
guid: "https://example.com/blog/x/",
|
|
77
|
+
categories: ["a", "b", "c"],
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
expect(xml).toContain("<category>a</category>");
|
|
82
|
+
expect(xml).toContain("<category>b</category>");
|
|
83
|
+
expect(xml).toContain("<category>c</category>");
|
|
84
|
+
});
|
|
85
|
+
it("escapes XML metacharacters in text content", () => {
|
|
86
|
+
const xml = renderRssFeed({
|
|
87
|
+
title: 'Title & "quoted" <tag>',
|
|
88
|
+
description: "A & B",
|
|
89
|
+
link: "https://example.com/blog/",
|
|
90
|
+
feedLink: "https://example.com/blog/rss.xml",
|
|
91
|
+
items: [
|
|
92
|
+
{
|
|
93
|
+
title: "1 < 2 & 3 > 0",
|
|
94
|
+
link: "https://example.com/blog/x/",
|
|
95
|
+
guid: "https://example.com/blog/x/",
|
|
96
|
+
description: "It's fine",
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
});
|
|
100
|
+
expect(xml).toContain("<title>Title & "quoted" <tag></title>");
|
|
101
|
+
expect(xml).toContain("<description>A & B</description>");
|
|
102
|
+
expect(xml).toContain("<title>1 < 2 & 3 > 0</title>");
|
|
103
|
+
expect(xml).toContain("<description>It's fine</description>");
|
|
104
|
+
});
|
|
105
|
+
it("leaves an unparsable pubDate unchanged", () => {
|
|
106
|
+
const xml = renderRssFeed({
|
|
107
|
+
title: "Blog",
|
|
108
|
+
description: "",
|
|
109
|
+
link: "https://example.com/blog/",
|
|
110
|
+
feedLink: "https://example.com/blog/rss.xml",
|
|
111
|
+
items: [
|
|
112
|
+
{
|
|
113
|
+
title: "x",
|
|
114
|
+
link: "https://example.com/blog/x/",
|
|
115
|
+
guid: "https://example.com/blog/x/",
|
|
116
|
+
pubDate: "not-a-date",
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
});
|
|
120
|
+
expect(xml).toContain("<pubDate>not-a-date</pubDate>");
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNzLnVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvaGVscGVycy9yc3MudW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXhDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7UUFDakQsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDO1lBQ3hCLEtBQUssRUFBRSxNQUFNO1lBQ2IsV0FBVyxFQUFFLGNBQWM7WUFDM0IsSUFBSSxFQUFFLDJCQUEyQjtZQUNqQyxRQUFRLEVBQUUsa0NBQWtDO1lBQzVDLEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDZDs7Ozs7Ozs7O0NBU0wsQ0FDSSxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1FBQ2xELE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQztZQUN4QixLQUFLLEVBQUUsTUFBTTtZQUNiLFdBQVcsRUFBRSxjQUFjO1lBQzNCLElBQUksRUFBRSwyQkFBMkI7WUFDakMsUUFBUSxFQUFFLGtDQUFrQztZQUM1QyxLQUFLLEVBQUU7Z0JBQ0w7b0JBQ0UsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLGlDQUFpQztvQkFDdkMsSUFBSSxFQUFFLGlDQUFpQztvQkFDdkMsV0FBVyxFQUFFLFlBQVk7b0JBQ3pCLE9BQU8sRUFBRSxzQkFBc0I7b0JBQy9CLE1BQU0sRUFBRSxNQUFNO29CQUNkLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQztpQkFDckI7YUFDRjtTQUNGLENBQUMs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QyxDQUFDLENBQUE7UUFDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFBO0lBQ3BFLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUM7WUFDeEIsS0FBSyxFQUFFLE1BQU07WUFDYixXQUFXLEVBQUUsRUFBRTtZQUNmLElBQUksRUFBRSwyQkFBMkI7WUFDakMsUUFBUSxFQUFFLGtDQUFrQztZQUM1QyxLQUFLLEVBQUU7Z0JBQ0w7b0JBQ0UsS0FBSyxFQUFFLEdBQUc7b0JBQ1YsSUFBSSxFQUFFLDZCQUE2QjtvQkFDbkMsSUFBSSxFQUFFLDZCQUE2QjtvQkFDbkMsT0FBTyxFQUFFLFlBQVk7aUJBQ3RCO2FBQ0Y7U0FDRixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLCtCQUErQixDQUFDLENBQUE7SUFDeEQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGUtcGx1cy90ZXN0XCJcbmltcG9ydCB7IHJlbmRlclJzc0ZlZWQgfSBmcm9tIFwiLi9yc3MudHNcIlxuXG5kZXNjcmliZShcInJlbmRlclJzc0ZlZWRcIiwgKCkgPT4ge1xuICBpdChcInJlbmRlcnMgYSBtaW5pbWFsIGNoYW5uZWwgd2l0aCBubyBpdGVtc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgeG1sID0gcmVuZGVyUnNzRmVlZCh7XG4gICAgICB0aXRsZTogXCJCbG9nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJMYXRlc3QgcG9zdHNcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ibG9nL1wiLFxuICAgICAgZmVlZExpbms6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ibG9nL3Jzcy54bWxcIixcbiAgICAgIGl0ZW1zOiBbXSxcbiAgICB9KVxuICAgIGV4cGVjdCh4bWwpLnRvQmUoXG4gICAgICBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cnNzIHZlcnNpb249XCIyLjBcIiB4bWxuczphdG9tPVwiaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tXCI+XG4gIDxjaGFubmVsPlxuICAgIDx0aXRsZT5CbG9nPC90aXRsZT5cbiAgICA8bGluaz5odHRwczovL2V4YW1wbGUuY29tL2Jsb2cvPC9saW5rPlxuICAgIDxkZXNjcmlwdGlvbj5MYXRlc3QgcG9zdHM8L2Rlc2NyaXB0aW9uPlxuICAgIDxhdG9tOmxpbmsgaHJlZj1cImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy9yc3MueG1sXCIgcmVsPVwic2VsZlwiIHR5cGU9XCJhcHBsaWNhdGlvbi9yc3MreG1sXCIgLz5cbiAgPC9jaGFubmVsPlxuPC9yc3M+XG5gLFxuICAgIClcbiAgfSlcblxuICBpdChcInJlbmRlcnMgYW4gaXRlbSB3aXRoIGFsbCBvcHRpb25hbCBmaWVsZHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHhtbCA9IHJlbmRlclJzc0ZlZWQoe1xuICAgICAgdGl0bGU6IFwiQmxvZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiTGF0ZXN0IHBvc3RzXCIsXG4gICAgICBsaW5rOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy9cIixcbiAgICAgIGZlZWRMaW5rOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy9yc3MueG1sXCIsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGl0bGU6IFwiSGVsbG9cIixcbiAgICAgICAgICBsaW5rOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy9oZWxsby9cIixcbiAgICAgICAgICBndWlkOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy9oZWxsby9cIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJGaXJzdCBwb3N0XCIsXG4gICAgICAgICAgcHViRGF0ZTogXCIyMDI2LTA1LTE2VDAwOjAwOjAwWlwiLFxuICAgICAgICAgIGF1dGhvcjogXCJKYW5lXCIsXG4gICAgICAgICAgY2F0ZWdvcmllczogW1wibmV3c1wiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSlcbiAgICBleHBlY3QoeG1sKS50b0NvbnRhaW4oXCI8dGl0bGU+SGVsbG88L3RpdGxlPlwiKVxuICAgIGV4cGVjdCh4bWwpLnRvQ29udGFpbihcIjxsaW5rPmh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy9oZWxsby88L2xpbms+XCIpXG4gICAgZXhwZWN0KHhtbCkudG9Db250YWluKFxuICAgICAgJzxndWlkIGlzUGVybWFMaW5rPVwidHJ1ZVwiPmh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy9oZWxsby88L2d1aWQ+JyxcbiAgICApXG4gICAgZXhwZWN0KHhtbCkudG9Db250YWluKFwiPGRlc2NyaXB0aW9uPkZpcnN0IHBvc3Q8L2Rlc2NyaXB0aW9uPlwiKVxuICAgIGV4cGVjdCh4bWwpLnRvQ29udGFpbihcIjxwdWJEYXRlPlNhdCwgMTYgTWF5IDIwMjYgMDA6MDA6MDAgR01UPC9wdWJEYXRlPlwiKVxuICAgIGV4cGVjdCh4bWwpLnRvQ29udGFpbihcIjxhdXRob3I+SmFuZTwvYXV0aG9yPlwiKVxuICAgIGV4cGVjdCh4bWwpLnRvQ29udGFpbihcIjxjYXRlZ29yeT5uZXdzPC9jYXRlZ29yeT5cIilcbiAgfSlcblxuICBpdChcImpvaW5zIGFycmF5IGF1dGhvcnMgd2l0aCBhIGNvbW1hXCIsICgpID0+IHtcbiAgICBjb25zdCB4bWwgPSByZW5kZXJSc3NGZWVkKHtcbiAgICAgIHRpdGxlOiBcIkJsb2dcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgICAgbGluazogXCJodHRwczovL2V4YW1wbGUuY29tL2Jsb2cvXCIsXG4gICAgICBmZWVkTGluazogXCJodHRwczovL2V4YW1wbGUuY29tL2Jsb2cvcnNzLnhtbFwiLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHRpdGxlOiBcInhcIixcbiAgICAgICAgICBsaW5rOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy94L1wiLFxuICAgICAgICAgIGd1aWQ6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ibG9nL3gvXCIsXG4gICAgICAgICAgYXV0aG9yOiBbXCJBbGljZVwiLCBcIkJvYlwiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSlcbiAgICBleHBlY3QoeG1sKS50b0NvbnRhaW4oXCI8YXV0aG9yPkFsaWNlLCBCb2I8L2F1dGhvcj5cIilcbiAgfSlcblxuICBpdChcImVtaXRzIG9uZSA8Y2F0ZWdvcnk+IHBlciB0YWdcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHhtbCA9IHJlbmRlclJzc0ZlZWQoe1xuICAgICAgdGl0bGU6IFwiQmxvZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgICBsaW5rOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy9cIixcbiAgICAgIGZlZWRMaW5rOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy9yc3MueG1sXCIsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGl0bGU6IFwieFwiLFxuICAgICAgICAgIGxpbms6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ibG9nL3gvXCIsXG4gICAgICAgICAgZ3VpZDogXCJodHRwczovL2V4YW1wbGUuY29tL2Jsb2cveC9cIixcbiAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJhXCIsIFwiYlwiLCBcImNcIl0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG4gICAgZXhwZWN0KHhtbCkudG9Db250YWluKFwiPGNhdGVnb3J5PmE8L2NhdGVnb3J5PlwiKVxuICAgIGV4cGVjdCh4bWwpLnRvQ29udGFpbihcIjxjYXRlZ29yeT5iPC9jYXRlZ29yeT5cIilcbiAgICBleHBlY3QoeG1sKS50b0NvbnRhaW4oXCI8Y2F0ZWdvcnk+YzwvY2F0ZWdvcnk+XCIpXG4gIH0pXG5cbiAgaXQoXCJlc2NhcGVzIFhNTCBtZXRhY2hhcmFjdGVycyBpbiB0ZXh0IGNvbnRlbnRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHhtbCA9IHJlbmRlclJzc0ZlZWQoe1xuICAgICAgdGl0bGU6ICdUaXRsZSAmIFwicXVvdGVkXCIgPHRhZz4nLFxuICAgICAgZGVzY3JpcHRpb246IFwiQSAmIEJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ibG9nL1wiLFxuICAgICAgZmVlZExpbms6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ibG9nL3Jzcy54bWxcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogXCIxIDwgMiAmIDMgPiAwXCIsXG4gICAgICAgICAgbGluazogXCJodHRwczovL2V4YW1wbGUuY29tL2Jsb2cveC9cIixcbiAgICAgICAgICBndWlkOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy94L1wiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkl0J3MgZmluZVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuICAgIGV4cGVjdCh4bWwpLnRvQ29udGFpbihcbiAgICAgIFwiPHRpdGxlPlRpdGxlICZhbXA7ICZxdW90O3F1b3RlZCZxdW90OyAmbHQ7dGFnJmd0OzwvdGl0bGU+XCIsXG4gICAgKVxuICAgIGV4cGVjdCh4bWwpLnRvQ29udGFpbihcIjxkZXNjcmlwdGlvbj5BICZhbXA7IEI8L2Rlc2NyaXB0aW9uPlwiKVxuICAgIGV4cGVjdCh4bWwpLnRvQ29udGFpbihcIjx0aXRsZT4xICZsdDsgMiAmYW1wOyAzICZndDsgMDwvdGl0bGU+XCIpXG4gICAgZXhwZWN0KHhtbCkudG9Db250YWluKFwiPGRlc2NyaXB0aW9uPkl0JmFwb3M7cyBmaW5lPC9kZXNjcmlwdGlvbj5cIilcbiAgfSlcblxuICBpdChcImxlYXZlcyBhbiB1bnBhcnNhYmxlIHB1YkRhdGUgdW5jaGFuZ2VkXCIsICgpID0+IHtcbiAgICBjb25zdCB4bWwgPSByZW5kZXJSc3NGZWVkKHtcbiAgICAgIHRpdGxlOiBcIkJsb2dcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgICAgbGluazogXCJodHRwczovL2V4YW1wbGUuY29tL2Jsb2cvXCIsXG4gICAgICBmZWVkTGluazogXCJodHRwczovL2V4YW1wbGUuY29tL2Jsb2cvcnNzLnhtbFwiLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHRpdGxlOiBcInhcIixcbiAgICAgICAgICBsaW5rOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmxvZy94L1wiLFxuICAgICAgICAgIGd1aWQ6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ibG9nL3gvXCIsXG4gICAgICAgICAgcHViRGF0ZTogXCJub3QtYS1kYXRlXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG4gICAgZXhwZWN0KHhtbCkudG9Db250YWluKFwiPHB1YkRhdGU+bm90LWEtZGF0ZTwvcHViRGF0ZT5cIilcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
import type { Config } from "../models/config.ts";
|
|
3
|
+
export interface RobotsOptions {
|
|
4
|
+
config: Config;
|
|
5
|
+
}
|
|
6
|
+
/** Emit a default `robots.txt` into the client build output, with a
|
|
7
|
+
* `Sitemap:` line pointing at the TanStack-Start-generated `sitemap.xml`
|
|
8
|
+
* when {@link Config.site} is set. Skipped when the consumer ships
|
|
9
|
+
* their own `.livemark/public/robots.txt` so the standard publicDir
|
|
10
|
+
* overlay wins — Vite copies the publicDir before writeBundle, so
|
|
11
|
+
* unconditional emitFile would silently overwrite the override. */
|
|
12
|
+
export declare function robots(opts: RobotsOptions): Plugin;
|
|
13
|
+
/** Render the body of a permissive default `robots.txt`. A `Sitemap:`
|
|
14
|
+
* line is appended only when `site` is set, because the directive
|
|
15
|
+
* requires a fully-qualified URL; `base` is included so the URL matches
|
|
16
|
+
* where the build (and the `sitemap.xml` inside it) is actually mounted. */
|
|
17
|
+
export declare function renderRobots(config: Pick<Config, "site" | "base">): string;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/** Emit a default `robots.txt` into the client build output, with a
|
|
4
|
+
* `Sitemap:` line pointing at the TanStack-Start-generated `sitemap.xml`
|
|
5
|
+
* when {@link Config.site} is set. Skipped when the consumer ships
|
|
6
|
+
* their own `.livemark/public/robots.txt` so the standard publicDir
|
|
7
|
+
* overlay wins — Vite copies the publicDir before writeBundle, so
|
|
8
|
+
* unconditional emitFile would silently overwrite the override. */
|
|
9
|
+
export function robots(opts) {
|
|
10
|
+
const overrideFile = join(opts.config.root, ".livemark", "public", "robots.txt");
|
|
11
|
+
return {
|
|
12
|
+
name: "livemark:robots",
|
|
13
|
+
applyToEnvironment(env) {
|
|
14
|
+
return env.name === "client";
|
|
15
|
+
},
|
|
16
|
+
generateBundle() {
|
|
17
|
+
if (existsSync(overrideFile))
|
|
18
|
+
return;
|
|
19
|
+
this.emitFile({
|
|
20
|
+
type: "asset",
|
|
21
|
+
fileName: "robots.txt",
|
|
22
|
+
source: renderRobots(opts.config),
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Render the body of a permissive default `robots.txt`. A `Sitemap:`
|
|
28
|
+
* line is appended only when `site` is set, because the directive
|
|
29
|
+
* requires a fully-qualified URL; `base` is included so the URL matches
|
|
30
|
+
* where the build (and the `sitemap.xml` inside it) is actually mounted. */
|
|
31
|
+
export function renderRobots(config) {
|
|
32
|
+
const lines = ["User-agent: *", "Allow: /"];
|
|
33
|
+
if (config.site) {
|
|
34
|
+
const host = config.site.replace(/\/+$/, "");
|
|
35
|
+
const base = config.base ?? "";
|
|
36
|
+
lines.push("", `Sitemap: ${host}${base}/sitemap.xml`);
|
|
37
|
+
}
|
|
38
|
+
return `${lines.join("\n")}\n`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1yb2JvdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvcGx1Z2lucy92aXRlLXJvYm90cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFRaEM7Ozs7O29FQUtvRTtBQUNwRSxNQUFNLFVBQVUsTUFBTSxDQUFDLElBQW1CO0lBQ3hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQ2hCLFdBQVcsRUFDWCxRQUFRLEVBQ1IsWUFBWSxDQUNiLENBQUE7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixrQkFBa0IsQ0FBQyxHQUFHO1lBQ3BCLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUE7UUFDOUIsQ0FBQztRQUNELGNBQWM7WUFDWixJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUM7Z0JBQUUsT0FBTTtZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRSxZQUFZO2dCQUN0QixNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDbEMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs2RUFHNkU7QUFDN0UsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFxQztJQUNoRSxNQUFNLEtBQUssR0FBRyxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUMzQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDNUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUE7UUFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsWUFBWSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9ib3RzT3B0aW9ucyB7XG4gIGNvbmZpZzogQ29uZmlnXG59XG5cbi8qKiBFbWl0IGEgZGVmYXVsdCBgcm9ib3RzLnR4dGAgaW50byB0aGUgY2xpZW50IGJ1aWxkIG91dHB1dCwgd2l0aCBhXG4gKiAgYFNpdGVtYXA6YCBsaW5lIHBvaW50aW5nIGF0IHRoZSBUYW5TdGFjay1TdGFydC1nZW5lcmF0ZWQgYHNpdGVtYXAueG1sYFxuICogIHdoZW4ge0BsaW5rIENvbmZpZy5zaXRlfSBpcyBzZXQuIFNraXBwZWQgd2hlbiB0aGUgY29uc3VtZXIgc2hpcHNcbiAqICB0aGVpciBvd24gYC5saXZlbWFyay9wdWJsaWMvcm9ib3RzLnR4dGAgc28gdGhlIHN0YW5kYXJkIHB1YmxpY0RpclxuICogIG92ZXJsYXkgd2lucyDigJQgVml0ZSBjb3BpZXMgdGhlIHB1YmxpY0RpciBiZWZvcmUgd3JpdGVCdW5kbGUsIHNvXG4gKiAgdW5jb25kaXRpb25hbCBlbWl0RmlsZSB3b3VsZCBzaWxlbnRseSBvdmVyd3JpdGUgdGhlIG92ZXJyaWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvYm90cyhvcHRzOiBSb2JvdHNPcHRpb25zKTogUGx1Z2luIHtcbiAgY29uc3Qgb3ZlcnJpZGVGaWxlID0gam9pbihcbiAgICBvcHRzLmNvbmZpZy5yb290LFxuICAgIFwiLmxpdmVtYXJrXCIsXG4gICAgXCJwdWJsaWNcIixcbiAgICBcInJvYm90cy50eHRcIixcbiAgKVxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwibGl2ZW1hcms6cm9ib3RzXCIsXG4gICAgYXBwbHlUb0Vudmlyb25tZW50KGVudikge1xuICAgICAgcmV0dXJuIGVudi5uYW1lID09PSBcImNsaWVudFwiXG4gICAgfSxcbiAgICBnZW5lcmF0ZUJ1bmRsZSgpIHtcbiAgICAgIGlmIChleGlzdHNTeW5jKG92ZXJyaWRlRmlsZSkpIHJldHVyblxuICAgICAgdGhpcy5lbWl0RmlsZSh7XG4gICAgICAgIHR5cGU6IFwiYXNzZXRcIixcbiAgICAgICAgZmlsZU5hbWU6IFwicm9ib3RzLnR4dFwiLFxuICAgICAgICBzb3VyY2U6IHJlbmRlclJvYm90cyhvcHRzLmNvbmZpZyksXG4gICAgICB9KVxuICAgIH0sXG4gIH1cbn1cblxuLyoqIFJlbmRlciB0aGUgYm9keSBvZiBhIHBlcm1pc3NpdmUgZGVmYXVsdCBgcm9ib3RzLnR4dGAuIEEgYFNpdGVtYXA6YFxuICogIGxpbmUgaXMgYXBwZW5kZWQgb25seSB3aGVuIGBzaXRlYCBpcyBzZXQsIGJlY2F1c2UgdGhlIGRpcmVjdGl2ZVxuICogIHJlcXVpcmVzIGEgZnVsbHktcXVhbGlmaWVkIFVSTDsgYGJhc2VgIGlzIGluY2x1ZGVkIHNvIHRoZSBVUkwgbWF0Y2hlc1xuICogIHdoZXJlIHRoZSBidWlsZCAoYW5kIHRoZSBgc2l0ZW1hcC54bWxgIGluc2lkZSBpdCkgaXMgYWN0dWFsbHkgbW91bnRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJSb2JvdHMoY29uZmlnOiBQaWNrPENvbmZpZywgXCJzaXRlXCIgfCBcImJhc2VcIj4pIHtcbiAgY29uc3QgbGluZXMgPSBbXCJVc2VyLWFnZW50OiAqXCIsIFwiQWxsb3c6IC9cIl1cbiAgaWYgKGNvbmZpZy5zaXRlKSB7XG4gICAgY29uc3QgaG9zdCA9IGNvbmZpZy5zaXRlLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICBjb25zdCBiYXNlID0gY29uZmlnLmJhc2UgPz8gXCJcIlxuICAgIGxpbmVzLnB1c2goXCJcIiwgYFNpdGVtYXA6ICR7aG9zdH0ke2Jhc2V9L3NpdGVtYXAueG1sYClcbiAgfVxuICByZXR1cm4gYCR7bGluZXMuam9pbihcIlxcblwiKX1cXG5gXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
2
|
+
import { renderRobots } from "./vite-robots.js";
|
|
3
|
+
describe("renderRobots", () => {
|
|
4
|
+
it("emits an allow-all body when site is not set", () => {
|
|
5
|
+
expect(renderRobots({})).toBe("User-agent: *\nAllow: /\n");
|
|
6
|
+
});
|
|
7
|
+
it("appends a Sitemap line when site is set", () => {
|
|
8
|
+
expect(renderRobots({ site: "https://livemark.dev" })).toBe("User-agent: *\nAllow: /\n\nSitemap: https://livemark.dev/sitemap.xml\n");
|
|
9
|
+
});
|
|
10
|
+
it("strips a trailing slash from site before composing the URL", () => {
|
|
11
|
+
expect(renderRobots({ site: "https://livemark.dev/" })).toBe("User-agent: *\nAllow: /\n\nSitemap: https://livemark.dev/sitemap.xml\n");
|
|
12
|
+
});
|
|
13
|
+
it("includes the base path so the URL matches the build mount", () => {
|
|
14
|
+
expect(renderRobots({ site: "https://user.github.io", base: "/repo" })).toBe("User-agent: *\nAllow: /\n\nSitemap: https://user.github.io/repo/sitemap.xml\n");
|
|
15
|
+
});
|
|
16
|
+
it("ignores base when site is not set", () => {
|
|
17
|
+
expect(renderRobots({ base: "/repo" })).toBe("User-agent: *\nAllow: /\n");
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1yb2JvdHMudW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtcm9ib3RzLnVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRS9DLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO0lBQzVCLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7UUFDdEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO0lBQzVELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEdBQUcsRUFBRTtRQUNqRCxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDekQsd0VBQXdFLENBQ3pFLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxHQUFHLEVBQUU7UUFDcEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzFELHdFQUF3RSxDQUN6RSxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1FBQ25FLE1BQU0sQ0FDSixZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQ2hFLENBQUMsSUFBSSxDQUNKLCtFQUErRSxDQUNoRixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsbUNBQW1DLEVBQUUsR0FBRyxFQUFFO1FBQzNDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO0lBQzNFLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgeyByZW5kZXJSb2JvdHMgfSBmcm9tIFwiLi92aXRlLXJvYm90cy50c1wiXG5cbmRlc2NyaWJlKFwicmVuZGVyUm9ib3RzXCIsICgpID0+IHtcbiAgaXQoXCJlbWl0cyBhbiBhbGxvdy1hbGwgYm9keSB3aGVuIHNpdGUgaXMgbm90IHNldFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbmRlclJvYm90cyh7fSkpLnRvQmUoXCJVc2VyLWFnZW50OiAqXFxuQWxsb3c6IC9cXG5cIilcbiAgfSlcblxuICBpdChcImFwcGVuZHMgYSBTaXRlbWFwIGxpbmUgd2hlbiBzaXRlIGlzIHNldFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbmRlclJvYm90cyh7IHNpdGU6IFwiaHR0cHM6Ly9saXZlbWFyay5kZXZcIiB9KSkudG9CZShcbiAgICAgIFwiVXNlci1hZ2VudDogKlxcbkFsbG93OiAvXFxuXFxuU2l0ZW1hcDogaHR0cHM6Ly9saXZlbWFyay5kZXYvc2l0ZW1hcC54bWxcXG5cIixcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzdHJpcHMgYSB0cmFpbGluZyBzbGFzaCBmcm9tIHNpdGUgYmVmb3JlIGNvbXBvc2luZyB0aGUgVVJMXCIsICgpID0+IHtcbiAgICBleHBlY3QocmVuZGVyUm9ib3RzKHsgc2l0ZTogXCJodHRwczovL2xpdmVtYXJrLmRldi9cIiB9KSkudG9CZShcbiAgICAgIFwiVXNlci1hZ2VudDogKlxcbkFsbG93OiAvXFxuXFxuU2l0ZW1hcDogaHR0cHM6Ly9saXZlbWFyay5kZXYvc2l0ZW1hcC54bWxcXG5cIixcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJpbmNsdWRlcyB0aGUgYmFzZSBwYXRoIHNvIHRoZSBVUkwgbWF0Y2hlcyB0aGUgYnVpbGQgbW91bnRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIHJlbmRlclJvYm90cyh7IHNpdGU6IFwiaHR0cHM6Ly91c2VyLmdpdGh1Yi5pb1wiLCBiYXNlOiBcIi9yZXBvXCIgfSksXG4gICAgKS50b0JlKFxuICAgICAgXCJVc2VyLWFnZW50OiAqXFxuQWxsb3c6IC9cXG5cXG5TaXRlbWFwOiBodHRwczovL3VzZXIuZ2l0aHViLmlvL3JlcG8vc2l0ZW1hcC54bWxcXG5cIixcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJpZ25vcmVzIGJhc2Ugd2hlbiBzaXRlIGlzIG5vdCBzZXRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZW5kZXJSb2JvdHMoeyBiYXNlOiBcIi9yZXBvXCIgfSkpLnRvQmUoXCJVc2VyLWFnZW50OiAqXFxuQWxsb3c6IC9cXG5cIilcbiAgfSlcbn0pXG4iXX0=
|
package/build/routeTree.gen.d.ts
CHANGED
|
@@ -1,32 +1,38 @@
|
|
|
1
1
|
import { Route as rootRouteImport } from './routes/__root';
|
|
2
2
|
import { Route as splatRouteImport } from './routes/$';
|
|
3
|
+
import { Route as SectionRssDotxmlRouteImport } from './routes/$section.rss[.]xml';
|
|
3
4
|
import { Route as IndexRouteImport } from './../.livemark/routes/index';
|
|
4
5
|
declare const splatRoute: any;
|
|
6
|
+
declare const SectionRssDotxmlRoute: any;
|
|
5
7
|
declare const IndexRoute: any;
|
|
6
8
|
export interface FileRoutesByFullPath {
|
|
7
9
|
'/': typeof IndexRoute;
|
|
8
10
|
'/$': typeof splatRoute;
|
|
11
|
+
'/$section/rss.xml': typeof SectionRssDotxmlRoute;
|
|
9
12
|
}
|
|
10
13
|
export interface FileRoutesByTo {
|
|
11
14
|
'/': typeof IndexRoute;
|
|
12
15
|
'/$': typeof splatRoute;
|
|
16
|
+
'/$section/rss.xml': typeof SectionRssDotxmlRoute;
|
|
13
17
|
}
|
|
14
18
|
export interface FileRoutesById {
|
|
15
19
|
__root__: typeof rootRouteImport;
|
|
16
20
|
'/': typeof IndexRoute;
|
|
17
21
|
'/$': typeof splatRoute;
|
|
22
|
+
'/$section/rss.xml': typeof SectionRssDotxmlRoute;
|
|
18
23
|
}
|
|
19
24
|
export interface FileRouteTypes {
|
|
20
25
|
fileRoutesByFullPath: FileRoutesByFullPath;
|
|
21
|
-
fullPaths: '/' | '/$';
|
|
26
|
+
fullPaths: '/' | '/$' | '/$section/rss.xml';
|
|
22
27
|
fileRoutesByTo: FileRoutesByTo;
|
|
23
|
-
to: '/' | '/$';
|
|
24
|
-
id: '__root__' | '/' | '/$';
|
|
28
|
+
to: '/' | '/$' | '/$section/rss.xml';
|
|
29
|
+
id: '__root__' | '/' | '/$' | '/$section/rss.xml';
|
|
25
30
|
fileRoutesById: FileRoutesById;
|
|
26
31
|
}
|
|
27
32
|
export interface RootRouteChildren {
|
|
28
33
|
IndexRoute: typeof IndexRoute;
|
|
29
34
|
splatRoute: typeof splatRoute;
|
|
35
|
+
SectionRssDotxmlRoute: typeof SectionRssDotxmlRoute;
|
|
30
36
|
}
|
|
31
37
|
declare module '@tanstack/react-router' {
|
|
32
38
|
interface FileRoutesByPath {
|
|
@@ -37,6 +43,13 @@ declare module '@tanstack/react-router' {
|
|
|
37
43
|
preLoaderRoute: typeof splatRouteImport;
|
|
38
44
|
parentRoute: typeof rootRouteImport;
|
|
39
45
|
};
|
|
46
|
+
'/$section/rss.xml': {
|
|
47
|
+
id: '/$section/rss.xml';
|
|
48
|
+
path: '/$section/rss.xml';
|
|
49
|
+
fullPath: '/$section/rss.xml';
|
|
50
|
+
preLoaderRoute: typeof SectionRssDotxmlRouteImport;
|
|
51
|
+
parentRoute: typeof rootRouteImport;
|
|
52
|
+
};
|
|
40
53
|
'/': {
|
|
41
54
|
id: '/';
|
|
42
55
|
path: '/';
|
package/build/routeTree.gen.js
CHANGED
|
@@ -6,12 +6,18 @@
|
|
|
6
6
|
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
|
|
7
7
|
import { Route as rootRouteImport } from './routes/__root';
|
|
8
8
|
import { Route as splatRouteImport } from './routes/$';
|
|
9
|
+
import { Route as SectionRssDotxmlRouteImport } from './routes/$section.rss[.]xml';
|
|
9
10
|
import { Route as IndexRouteImport } from './../.livemark/routes/index';
|
|
10
11
|
const splatRoute = splatRouteImport.update({
|
|
11
12
|
id: '/$',
|
|
12
13
|
path: '/$',
|
|
13
14
|
getParentRoute: () => rootRouteImport,
|
|
14
15
|
});
|
|
16
|
+
const SectionRssDotxmlRoute = SectionRssDotxmlRouteImport.update({
|
|
17
|
+
id: '/$section/rss.xml',
|
|
18
|
+
path: '/$section/rss.xml',
|
|
19
|
+
getParentRoute: () => rootRouteImport,
|
|
20
|
+
});
|
|
15
21
|
const IndexRoute = IndexRouteImport.update({
|
|
16
22
|
id: '/',
|
|
17
23
|
path: '/',
|
|
@@ -20,8 +26,9 @@ const IndexRoute = IndexRouteImport.update({
|
|
|
20
26
|
const rootRouteChildren = {
|
|
21
27
|
IndexRoute: IndexRoute,
|
|
22
28
|
splatRoute: splatRoute,
|
|
29
|
+
SectionRssDotxmlRoute: SectionRssDotxmlRoute,
|
|
23
30
|
};
|
|
24
31
|
export const routeTree = rootRouteImport
|
|
25
32
|
._addFileChildren(rootRouteChildren)
|
|
26
33
|
._addFileTypes();
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVUcmVlLmdlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9yb3V0ZVRyZWUuZ2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUVwQixjQUFjO0FBRWQscUNBQXFDO0FBRXJDLDREQUE0RDtBQUM1RCwwRUFBMEU7QUFDMUUsa0lBQWtJO0FBRWxJLE9BQU8sRUFBRSxLQUFLLElBQUksZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDMUQsT0FBTyxFQUFFLEtBQUssSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN0RCxPQUFPLEVBQUUsS0FBSyxJQUFJLDJCQUEyQixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDbEYsT0FBTyxFQUFFLEtBQUssSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBRXZFLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztJQUN6QyxFQUFFLEVBQUUsSUFBSTtJQUNSLElBQUksRUFBRSxJQUFJO0lBQ1YsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLGVBQWU7Q0FDL0IsQ0FBQyxDQUFBO0FBQ1QsTUFBTSxxQkFBcUIsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUM7SUFDL0QsRUFBRSxFQUFFLG1CQUFtQjtJQUN2QixJQUFJLEVBQUUsbUJBQW1CO0lBQ3pCLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxlQUFlO0NBQy9CLENBQUMsQ0FBQTtBQUNULE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztJQUN6QyxFQUFFLEVBQUUsR0FBRztJQUNQLElBQUksRUFBRSxHQUFHO0lBQ1QsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLGVBQWU7Q0FDL0IsQ0FBQyxDQUFBO0FBMERULE1BQU0saUJBQWlCLEdBQXNCO0lBQzNDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFBO0FBQ0QsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGVBQWU7S0FDckMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUM7S0FDbkMsYUFBYSxFQUFrQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gQHRzLW5vY2hlY2tcblxuLy8gbm9pbnNwZWN0aW9uIEpTVW51c2VkR2xvYmFsU3ltYm9sc1xuXG4vLyBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFRhblN0YWNrIFJvdXRlci5cbi8vIFlvdSBzaG91bGQgTk9UIG1ha2UgYW55IGNoYW5nZXMgaW4gdGhpcyBmaWxlIGFzIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4vLyBBZGRpdGlvbmFsbHksIHlvdSBzaG91bGQgYWxzbyBleGNsdWRlIHRoaXMgZmlsZSBmcm9tIHlvdXIgbGludGVyIGFuZC9vciBmb3JtYXR0ZXIgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNoZWNrZWQgb3IgbW9kaWZpZWQuXG5cbmltcG9ydCB7IFJvdXRlIGFzIHJvb3RSb3V0ZUltcG9ydCB9IGZyb20gJy4vcm91dGVzL19fcm9vdCdcbmltcG9ydCB7IFJvdXRlIGFzIHNwbGF0Um91dGVJbXBvcnQgfSBmcm9tICcuL3JvdXRlcy8kJ1xuaW1wb3J0IHsgUm91dGUgYXMgU2VjdGlvblJzc0RvdHhtbFJvdXRlSW1wb3J0IH0gZnJvbSAnLi9yb3V0ZXMvJHNlY3Rpb24ucnNzWy5deG1sJ1xuaW1wb3J0IHsgUm91dGUgYXMgSW5kZXhSb3V0ZUltcG9ydCB9IGZyb20gJy4vLi4vLmxpdmVtYXJrL3JvdXRlcy9pbmRleCdcblxuY29uc3Qgc3BsYXRSb3V0ZSA9IHNwbGF0Um91dGVJbXBvcnQudXBkYXRlKHtcbiAgaWQ6ICcvJCcsXG4gIHBhdGg6ICcvJCcsXG4gIGdldFBhcmVudFJvdXRlOiAoKSA9PiByb290Um91dGVJbXBvcnQsXG59IGFzIGFueSlcbmNvbnN0IFNlY3Rpb25Sc3NEb3R4bWxSb3V0ZSA9IFNlY3Rpb25Sc3NEb3R4bWxSb3V0ZUltcG9ydC51cGRhdGUoe1xuICBpZDogJy8kc2VjdGlvbi9yc3MueG1sJyxcbiAgcGF0aDogJy8kc2VjdGlvbi9yc3MueG1sJyxcbiAgZ2V0UGFyZW50Um91dGU6ICgpID0+IHJvb3RSb3V0ZUltcG9ydCxcbn0gYXMgYW55KVxuY29uc3QgSW5kZXhSb3V0ZSA9IEluZGV4Um91dGVJbXBvcnQudXBkYXRlKHtcbiAgaWQ6ICcvJyxcbiAgcGF0aDogJy8nLFxuICBnZXRQYXJlbnRSb3V0ZTogKCkgPT4gcm9vdFJvdXRlSW1wb3J0LFxufSBhcyBhbnkpXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJvdXRlc0J5RnVsbFBhdGgge1xuICAnLyc6IHR5cGVvZiBJbmRleFJvdXRlXG4gICcvJCc6IHR5cGVvZiBzcGxhdFJvdXRlXG4gICcvJHNlY3Rpb24vcnNzLnhtbCc6IHR5cGVvZiBTZWN0aW9uUnNzRG90eG1sUm91dGVcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJvdXRlc0J5VG8ge1xuICAnLyc6IHR5cGVvZiBJbmRleFJvdXRlXG4gICcvJCc6IHR5cGVvZiBzcGxhdFJvdXRlXG4gICcvJHNlY3Rpb24vcnNzLnhtbCc6IHR5cGVvZiBTZWN0aW9uUnNzRG90eG1sUm91dGVcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJvdXRlc0J5SWQge1xuICBfX3Jvb3RfXzogdHlwZW9mIHJvb3RSb3V0ZUltcG9ydFxuICAnLyc6IHR5cGVvZiBJbmRleFJvdXRlXG4gICcvJCc6IHR5cGVvZiBzcGxhdFJvdXRlXG4gICcvJHNlY3Rpb24vcnNzLnhtbCc6IHR5cGVvZiBTZWN0aW9uUnNzRG90eG1sUm91dGVcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJvdXRlVHlwZXMge1xuICBmaWxlUm91dGVzQnlGdWxsUGF0aDogRmlsZVJvdXRlc0J5RnVsbFBhdGhcbiAgZnVsbFBhdGhzOiAnLycgfCAnLyQnIHwgJy8kc2VjdGlvbi9yc3MueG1sJ1xuICBmaWxlUm91dGVzQnlUbzogRmlsZVJvdXRlc0J5VG9cbiAgdG86ICcvJyB8ICcvJCcgfCAnLyRzZWN0aW9uL3Jzcy54bWwnXG4gIGlkOiAnX19yb290X18nIHwgJy8nIHwgJy8kJyB8ICcvJHNlY3Rpb24vcnNzLnhtbCdcbiAgZmlsZVJvdXRlc0J5SWQ6IEZpbGVSb3V0ZXNCeUlkXG59XG5leHBvcnQgaW50ZXJmYWNlIFJvb3RSb3V0ZUNoaWxkcmVuIHtcbiAgSW5kZXhSb3V0ZTogdHlwZW9mIEluZGV4Um91dGVcbiAgc3BsYXRSb3V0ZTogdHlwZW9mIHNwbGF0Um91dGVcbiAgU2VjdGlvblJzc0RvdHhtbFJvdXRlOiB0eXBlb2YgU2VjdGlvblJzc0RvdHhtbFJvdXRlXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGFuc3RhY2svcmVhY3Qtcm91dGVyJyB7XG4gIGludGVyZmFjZSBGaWxlUm91dGVzQnlQYXRoIHtcbiAgICAnLyQnOiB7XG4gICAgICBpZDogJy8kJ1xuICAgICAgcGF0aDogJy8kJ1xuICAgICAgZnVsbFBhdGg6ICcvJCdcbiAgICAgIHByZUxvYWRlclJvdXRlOiB0eXBlb2Ygc3BsYXRSb3V0ZUltcG9ydFxuICAgICAgcGFyZW50Um91dGU6IHR5cGVvZiByb290Um91dGVJbXBvcnRcbiAgICB9XG4gICAgJy8kc2VjdGlvbi9yc3MueG1sJzoge1xuICAgICAgaWQ6ICcvJHNlY3Rpb24vcnNzLnhtbCdcbiAgICAgIHBhdGg6ICcvJHNlY3Rpb24vcnNzLnhtbCdcbiAgICAgIGZ1bGxQYXRoOiAnLyRzZWN0aW9uL3Jzcy54bWwnXG4gICAgICBwcmVMb2FkZXJSb3V0ZTogdHlwZW9mIFNlY3Rpb25Sc3NEb3R4bWxSb3V0ZUltcG9ydFxuICAgICAgcGFyZW50Um91dGU6IHR5cGVvZiByb290Um91dGVJbXBvcnRcbiAgICB9XG4gICAgJy8nOiB7XG4gICAgICBpZDogJy8nXG4gICAgICBwYXRoOiAnLydcbiAgICAgIGZ1bGxQYXRoOiAnLydcbiAgICAgIHByZUxvYWRlclJvdXRlOiB0eXBlb2YgSW5kZXhSb3V0ZUltcG9ydFxuICAgICAgcGFyZW50Um91dGU6IHR5cGVvZiByb290Um91dGVJbXBvcnRcbiAgICB9XG4gIH1cbn1cblxuY29uc3Qgcm9vdFJvdXRlQ2hpbGRyZW46IFJvb3RSb3V0ZUNoaWxkcmVuID0ge1xuICBJbmRleFJvdXRlOiBJbmRleFJvdXRlLFxuICBzcGxhdFJvdXRlOiBzcGxhdFJvdXRlLFxuICBTZWN0aW9uUnNzRG90eG1sUm91dGU6IFNlY3Rpb25Sc3NEb3R4bWxSb3V0ZSxcbn1cbmV4cG9ydCBjb25zdCByb3V0ZVRyZWUgPSByb290Um91dGVJbXBvcnRcbiAgLl9hZGRGaWxlQ2hpbGRyZW4ocm9vdFJvdXRlQ2hpbGRyZW4pXG4gIC5fYWRkRmlsZVR5cGVzPEZpbGVSb3V0ZVR5cGVzPigpXG5cbmltcG9ydCB0eXBlIHsgZ2V0Um91dGVyIH0gZnJvbSAnLi9yb3V0ZXIudHN4J1xuaW1wb3J0IHR5cGUgeyBjcmVhdGVTdGFydCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1zdGFydCdcbmRlY2xhcmUgbW9kdWxlICdAdGFuc3RhY2svcmVhY3Qtc3RhcnQnIHtcbiAgaW50ZXJmYWNlIFJlZ2lzdGVyIHtcbiAgICBzc3I6IHRydWVcbiAgICByb3V0ZXI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0Um91dGVyPj5cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const Route: import("@tanstack/router-core").Route<import("@tanstack/react-router").Register, any, "/$section/rss.xml", "/$section/rss.xml", "/$section/rss.xml", "/$section/rss.xml", undefined, import("@tanstack/react-router").ResolveParams<"/$section/rss.xml">, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, {
|
|
2
|
+
GET: ({ params }: {
|
|
3
|
+
params: {
|
|
4
|
+
section: string;
|
|
5
|
+
};
|
|
6
|
+
}) => Promise<Response>;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { config } from "livemark:virtual";
|
|
2
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
3
|
+
import { sectionFlatArticles, sortedArticles } from "../content/article.js";
|
|
4
|
+
import { renderRssFeed } from "../helpers/rss.js";
|
|
5
|
+
const FEED_ITEM_LIMIT = 20;
|
|
6
|
+
export const Route = createFileRoute("/$section/rss.xml")({
|
|
7
|
+
server: {
|
|
8
|
+
handlers: {
|
|
9
|
+
GET: async ({ params }) => {
|
|
10
|
+
if (!config.site) {
|
|
11
|
+
return new Response("RSS requires `site` in livemark.config.ts", {
|
|
12
|
+
status: 404,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
const prefix = `/${params.section}/`;
|
|
16
|
+
const section = config.sections?.find(s => s.type === "blog" && s.prefix === prefix);
|
|
17
|
+
if (!section || section.type !== "blog") {
|
|
18
|
+
return new Response("Not found", { status: 404 });
|
|
19
|
+
}
|
|
20
|
+
const host = config.site.replace(/\/+$/, "");
|
|
21
|
+
const base = config.base ?? "";
|
|
22
|
+
const toAbsolute = (path) => `${host}${base}${path}`;
|
|
23
|
+
const paths = sectionFlatArticles.get(section.prefix) ?? [];
|
|
24
|
+
const items = [];
|
|
25
|
+
for (const path of paths) {
|
|
26
|
+
if (items.length >= FEED_ITEM_LIMIT)
|
|
27
|
+
break;
|
|
28
|
+
const article = sortedArticles.find(a => a.path === path);
|
|
29
|
+
if (!article?.date)
|
|
30
|
+
continue;
|
|
31
|
+
const link = toAbsolute(article.path);
|
|
32
|
+
items.push({
|
|
33
|
+
title: article.title,
|
|
34
|
+
link,
|
|
35
|
+
guid: link,
|
|
36
|
+
description: article.description,
|
|
37
|
+
pubDate: article.date,
|
|
38
|
+
author: article.author,
|
|
39
|
+
categories: article.tags,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const xml = renderRssFeed({
|
|
43
|
+
title: section.siteTitle ?? section.title,
|
|
44
|
+
description: section.siteDescription ?? config.description ?? "",
|
|
45
|
+
link: toAbsolute(section.prefix),
|
|
46
|
+
feedLink: toAbsolute(`${section.prefix}rss.xml`),
|
|
47
|
+
items,
|
|
48
|
+
});
|
|
49
|
+
return new Response(xml, {
|
|
50
|
+
headers: { "Content-Type": "application/rss+xml; charset=utf-8" },
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiJHNlY3Rpb24ucnNzWy5deG1sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL3JvdXRlcy8kc2VjdGlvbi5yc3NbLl14bWwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQWdCLE1BQU0sbUJBQW1CLENBQUE7QUFFL0QsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFBO0FBRTFCLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN4RCxNQUFNLEVBQUU7UUFDTixRQUFRLEVBQUU7WUFDUixHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFtQyxFQUFFLEVBQUU7Z0JBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2pCLE9BQU8sSUFBSSxRQUFRLENBQUMsMkNBQTJDLEVBQUU7d0JBQy9ELE1BQU0sRUFBRSxHQUFHO3FCQUNaLENBQUMsQ0FBQTtnQkFDSixDQUFDO2dCQUNELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFBO2dCQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FDbkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FDOUMsQ0FBQTtnQkFDRCxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQ3hDLE9BQU8sSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7Z0JBQ25ELENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO2dCQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtnQkFDOUIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQTtnQkFFNUQsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUE7Z0JBQzNELE1BQU0sS0FBSyxHQUFjLEVBQUUsQ0FBQTtnQkFDM0IsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLGVBQWU7d0JBQUUsTUFBSztvQkFDMUMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUE7b0JBQ3pELElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSTt3QkFBRSxTQUFRO29CQUM1QixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUNyQyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUNULEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSzt3QkFDcEIsSUFBSTt3QkFDSixJQUFJLEVBQUUsSUFBSTt3QkFDVixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7d0JBQ2hDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSTt3QkFDckIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO3dCQUN0QixVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUk7cUJBQ3pCLENBQUMsQ0FBQTtnQkFDSixDQUFDO2dCQUVELE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQztvQkFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLEtBQUs7b0JBQ3pDLFdBQVcsRUFBRSxPQUFPLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRTtvQkFDaEUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO29CQUNoQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sU0FBUyxDQUFDO29CQUNoRCxLQUFLO2lCQUNOLENBQUMsQ0FBQTtnQkFFRixPQUFPLElBQUksUUFBUSxDQUFDLEdBQUcsRUFBRTtvQkFDdkIsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLG9DQUFvQyxFQUFFO2lCQUNsRSxDQUFDLENBQUE7WUFDSixDQUFDO1NBQ0Y7S0FDRjtDQUNGLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCJsaXZlbWFyazp2aXJ0dWFsXCJcbmltcG9ydCB7IGNyZWF0ZUZpbGVSb3V0ZSB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyXCJcbmltcG9ydCB7IHNlY3Rpb25GbGF0QXJ0aWNsZXMsIHNvcnRlZEFydGljbGVzIH0gZnJvbSBcIi4uL2NvbnRlbnQvYXJ0aWNsZS50c1wiXG5pbXBvcnQgeyByZW5kZXJSc3NGZWVkLCB0eXBlIFJzc0l0ZW0gfSBmcm9tIFwiLi4vaGVscGVycy9yc3MudHNcIlxuXG5jb25zdCBGRUVEX0lURU1fTElNSVQgPSAyMFxuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVGaWxlUm91dGUoXCIvJHNlY3Rpb24vcnNzLnhtbFwiKSh7XG4gIHNlcnZlcjoge1xuICAgIGhhbmRsZXJzOiB7XG4gICAgICBHRVQ6IGFzeW5jICh7IHBhcmFtcyB9OiB7IHBhcmFtczogeyBzZWN0aW9uOiBzdHJpbmcgfSB9KSA9PiB7XG4gICAgICAgIGlmICghY29uZmlnLnNpdGUpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFwiUlNTIHJlcXVpcmVzIGBzaXRlYCBpbiBsaXZlbWFyay5jb25maWcudHNcIiwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmVmaXggPSBgLyR7cGFyYW1zLnNlY3Rpb259L2BcbiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGNvbmZpZy5zZWN0aW9ucz8uZmluZChcbiAgICAgICAgICBzID0+IHMudHlwZSA9PT0gXCJibG9nXCIgJiYgcy5wcmVmaXggPT09IHByZWZpeCxcbiAgICAgICAgKVxuICAgICAgICBpZiAoIXNlY3Rpb24gfHwgc2VjdGlvbi50eXBlICE9PSBcImJsb2dcIikge1xuICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoXCJOb3QgZm91bmRcIiwgeyBzdGF0dXM6IDQwNCB9KVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvc3QgPSBjb25maWcuc2l0ZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgICAgIGNvbnN0IGJhc2UgPSBjb25maWcuYmFzZSA/PyBcIlwiXG4gICAgICAgIGNvbnN0IHRvQWJzb2x1dGUgPSAocGF0aDogc3RyaW5nKSA9PiBgJHtob3N0fSR7YmFzZX0ke3BhdGh9YFxuXG4gICAgICAgIGNvbnN0IHBhdGhzID0gc2VjdGlvbkZsYXRBcnRpY2xlcy5nZXQoc2VjdGlvbi5wcmVmaXgpID8/IFtdXG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSc3NJdGVtW10gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID49IEZFRURfSVRFTV9MSU1JVCkgYnJlYWtcbiAgICAgICAgICBjb25zdCBhcnRpY2xlID0gc29ydGVkQXJ0aWNsZXMuZmluZChhID0+IGEucGF0aCA9PT0gcGF0aClcbiAgICAgICAgICBpZiAoIWFydGljbGU/LmRhdGUpIGNvbnRpbnVlXG4gICAgICAgICAgY29uc3QgbGluayA9IHRvQWJzb2x1dGUoYXJ0aWNsZS5wYXRoKVxuICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IGFydGljbGUudGl0bGUsXG4gICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgZ3VpZDogbGluayxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhcnRpY2xlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHViRGF0ZTogYXJ0aWNsZS5kYXRlLFxuICAgICAgICAgICAgYXV0aG9yOiBhcnRpY2xlLmF1dGhvcixcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IGFydGljbGUudGFncyxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeG1sID0gcmVuZGVyUnNzRmVlZCh7XG4gICAgICAgICAgdGl0bGU6IHNlY3Rpb24uc2l0ZVRpdGxlID8/IHNlY3Rpb24udGl0bGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNlY3Rpb24uc2l0ZURlc2NyaXB0aW9uID8/IGNvbmZpZy5kZXNjcmlwdGlvbiA/PyBcIlwiLFxuICAgICAgICAgIGxpbms6IHRvQWJzb2x1dGUoc2VjdGlvbi5wcmVmaXgpLFxuICAgICAgICAgIGZlZWRMaW5rOiB0b0Fic29sdXRlKGAke3NlY3Rpb24ucHJlZml4fXJzcy54bWxgKSxcbiAgICAgICAgICBpdGVtcyxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHhtbCwge1xuICAgICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9yc3MreG1sOyBjaGFyc2V0PXV0Zi04XCIgfSxcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iXX0=
|