From 6da06b80a949ef10bc5c80237db46fe91f42c5a0 Mon Sep 17 00:00:00 2001 From: Grace Ujah Date: Sun, 12 Jul 2026 21:04:12 +0100 Subject: [PATCH] Add RSS feed generation for blog posts --- docs/.vitepress/config.mts | 31 +++++++++ package-lock.json | 135 +++++++++++-------------------------- package.json | 1 + 3 files changed, 73 insertions(+), 94 deletions(-) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 794258c17..1427513a9 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,6 +1,9 @@ import path from 'node:path' import { fileURLToPath } from 'node:url' import { defineConfig, type DefaultTheme } from 'vitepress' +import fs from 'node:fs/promises' +import { Feed } from 'feed' +import { readBlogPosts } from '../blog/_taxonomy.ts' const __dirname = path.dirname(fileURLToPath(import.meta.url)) @@ -124,6 +127,7 @@ export default defineConfig({ ['link', { rel: 'apple-touch-icon', href: '/img/favicon/apple-touch-icon.png' }], ['link', { rel: 'manifest', href: '/site.webmanifest' }], ['link', { rel: 'preload', as: 'font', type: 'font/woff2', crossorigin: '', href: '/fonts/ibm-plex-mono-400.woff2' }], + ['link', { rel: 'alternate', type: 'application/rss+xml', title: 'LDK Blog', href: '/rss.xml' }], ['meta', { name: 'msapplication-config', content: '/browserconfig.xml' }], ['meta', { name: 'theme-color', content: '#ffffff' }], ['meta', { property: 'og:type', content: 'website' }], @@ -223,4 +227,31 @@ export default defineConfig({ dedupe: ['vue'], }, }, + + async buildEnd(siteConfig) { + const posts = await readBlogPosts(path.join(siteConfig.srcDir, 'blog')) + + const feed = new Feed({ + title: 'Lightning Dev Kit Documentation Blog', + description: 'LDK is a flexible lightning implementation with supporting batteries (or modules).', + id: 'https://lightningdevkit.org/blog/', + link: 'https://lightningdevkit.org/blog/', + language: 'en', + copyright: `Copyright © ${new Date().getFullYear()} LDK Developers`, + updated: posts[0] ? new Date(posts[0].date) : new Date(), + }) + + for (const post of posts) { + feed.addItem({ + title: post.title, + id: `https://lightningdevkit.org${post.url}`, + link: `https://lightningdevkit.org${post.url}`, + description: post.description, + author: post.authors.map((name) => ({ name })), + date: new Date(post.date), + }) + } + + await fs.writeFile(path.join(siteConfig.outDir, 'rss.xml'), feed.rss2()) + }, }) diff --git a/package-lock.json b/package-lock.json index a23a9e1b2..7a9325ca3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "devDependencies": { "@spiralbtc/vuepress-devkit-theme": "^0.21.0", "broken-link-checker": "0.7.8", + "feed": "^6.0.0", "serve": "14.2.6", "start-server-and-test": "3.0.5", "vitepress": "^1.5.0", @@ -2754,19 +2755,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -11464,16 +11452,17 @@ } }, "node_modules/feed": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/feed/-/feed-2.0.4.tgz", - "integrity": "sha512-sWatfulDP6d18qVaWcu34qmq9ml6UeN6nHSBJpNZ2muBqxjPAdT375whPYAHP+gqLfyabtYU5qf2Dv4nqtlp0w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/feed/-/feed-6.0.0.tgz", + "integrity": "sha512-rvFOF1POce0ijAKy3tZN5T8PuprgIit/VbMyXJWcoYwcMOTSIJ7NqZb8DTLPJr77yiEO27kidm/fw0kcSIV+ww==", "dev": true, + "license": "MIT", "dependencies": { - "luxon": "^1.3.3", - "xml": "^1.0.1" + "xml-js": "^1.6.11" }, "engines": { - "node": ">=0.4.0" + "node": ">=20", + "pnpm": ">=10" } }, "node_modules/figgy-pudding": { @@ -12449,11 +12438,10 @@ } }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -14491,6 +14479,7 @@ "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz", "integrity": "sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -23044,36 +23033,6 @@ } } }, - "node_modules/vitepress/node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/vitepress/node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, "node_modules/vitepress/node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -23113,25 +23072,6 @@ "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/vitepress/node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/vitepress/node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -23147,27 +23087,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/vitepress/node_modules/terser": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", - "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/vitepress/node_modules/vite": { "version": "5.4.21", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", @@ -23682,6 +23601,20 @@ "vuepress": "1.x" } }, + "node_modules/vuepress-plugin-feed/node_modules/feed": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/feed/-/feed-2.0.4.tgz", + "integrity": "sha512-sWatfulDP6d18qVaWcu34qmq9ml6UeN6nHSBJpNZ2muBqxjPAdT375whPYAHP+gqLfyabtYU5qf2Dv4nqtlp0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "luxon": "^1.3.3", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/vuepress-plugin-mailchimp": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/vuepress-plugin-mailchimp/-/vuepress-plugin-mailchimp-1.4.2.tgz", @@ -25272,7 +25205,21 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } }, "node_modules/xmlbuilder": { "version": "13.0.2", diff --git a/package.json b/package.json index 598e93ac3..c23b44dfc 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "devDependencies": { "@spiralbtc/vuepress-devkit-theme": "^0.21.0", "broken-link-checker": "0.7.8", + "feed": "^6.0.0", "serve": "14.2.6", "start-server-and-test": "3.0.5", "vitepress": "^1.5.0",