diff --git a/package-lock.json b/package-lock.json index 453adfb1..a69563de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,6 @@ "requires": true, "packages": { "": { - "name": "ipfs-blog", "version": "1.0.0", "dependencies": { "dayjs": "^1.10.4", @@ -60,7 +59,8 @@ "vuepress-plugin-clean-urls": "^1.1.2", "vuepress-plugin-ipfs": "^1.0.2", "vuepress-plugin-robots": "^1.0.1", - "vuepress-plugin-seo": "^0.1.4" + "vuepress-plugin-seo": "^0.1.4", + "xml2js": "^0.4.23" } }, "node_modules/@babel/code-frame": { @@ -23831,6 +23831,28 @@ "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlbuilder": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", @@ -44520,6 +44542,24 @@ "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + } + } + }, "xmlbuilder": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", diff --git a/package.json b/package.json index 4e15d161..87144034 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "start": "npm run dev", "dev": "vuepress dev src", - "build": "vuepress build src", + "build": "vuepress build src && npm run postbuild", + "postbuild": "./scripts/latest-posts.js", "lint": "prettier --write \"**/*.{json,yaml,md}\" && run-p lint:**", "lint:eslint": "eslint --cache \"**/*.{js,vue}\" --fix", "lint:styles": "stylelint \"**/*.css\" \"src/.vuepress/**/*.css\" --fix" @@ -56,7 +57,8 @@ "vuepress-plugin-clean-urls": "^1.1.2", "vuepress-plugin-ipfs": "^1.0.2", "vuepress-plugin-robots": "^1.0.1", - "vuepress-plugin-seo": "^0.1.4" + "vuepress-plugin-seo": "^0.1.4", + "xml2js": "^0.4.23" }, "husky": { "hooks": { diff --git a/scripts/latest-posts.js b/scripts/latest-posts.js new file mode 100755 index 00000000..83c31ccd --- /dev/null +++ b/scripts/latest-posts.js @@ -0,0 +1,58 @@ +#!/usr/bin/env node + +'use strict' + +/** + The ipfs.io website requests for a blog.ipfs.io/index.json file + with the latest 4 posts. + This script parses the rss feed file index.xml and generates the + required index.json file. + + @see https://github.com/ipfs/ipfs-blog/issues/104 +*/ + +const fs = require('fs') +const xml2js = require('xml2js') +const dayjs = require('dayjs') + +const xmlFilePath = 'dist/index.xml' +const jsonFilePath = 'dist/index.json' + +function generateJsonFile(xml) { + xml2js.parseString(xml, (error, dataObj) => { + if (error) { + console.error(error) + return process.exit(1) + } + + const posts = dataObj.rss.channel[0].item.slice(0, 4).map((item) => ({ + title: item.title[0], + date: dayjs(item.pubDate[0]).format('DD MMMM YYYY'), + url: item.link[0], + author: '', + })) + + fs.writeFile(jsonFilePath, JSON.stringify({ posts }), (error) => { + if (error) { + console.error(error) + return process.exit(1) + } + }) + }) +} + +fs.readFile(xmlFilePath, { encoding: 'utf-8' }, (error, data) => { + if (error) { + console.error(error) + + if (error.code === 'ENOENT') { + console.error( + "rss xml file not found – couldn't generate the index.json file." + ) + } + + return process.exit(1) + } + + generateJsonFile(data) +})