sitespeed.io/release/feed.js

133 lines
4.0 KiB
JavaScript

const Feed = require('feed').Feed;
const fs = require('fs');
const path = require('path');
const parseChangelog = require('changelog-parser');
const getSortedFiles = dir => {
const files = fs.readdirSync(dir);
return files
.map(fileName => ({
fileName: fileName,
name: path.parse(fileName).name,
time: fs.statSync(`${dir}/${fileName}`).mtime.getTime(),
version: fs.readFileSync(`${dir}/${fileName}`, 'utf8').trim()
}))
.sort((a, b) => b.time - a.time);
};
function getResult(result) {
let allData = '';
if (result.parsed) {
if (result.parsed.Added) {
for (let added of result.parsed.Added) {
allData += ' ' + added;
}
}
if (result.parsed.Fixed) {
for (let fixed of result.parsed.Fixed) {
allData += ' ' + fixed;
}
}
if (result.parsed.Changed) {
for (let changed of result.parsed.Changed) {
allData += ' ' + changed;
}
}
if (result.parsed['Breaking changes']) {
for (let breaking of result.parsed['Breaking changes']) {
allData += ' ' + breaking;
}
}
return allData;
}
}
async function generateFeed() {
const versionDir = './docs/_includes/version/';
const sortedVersionFiles = getSortedFiles(versionDir);
const feed = new Feed({
title: 'sitespeed.io release feed',
description: 'Follow new releases of sitespeed.io tools',
id: 'https://www.sitespeed.io',
link: 'https://www.sitespeed.io',
language: 'en', // optional, used only in RSS 2.0, possible values: http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes
image: 'https://www.sitespeed.io/img/logos/sitespeed.io.png',
favicon: 'http://www.sitespeed.io/favicon.ico',
copyright: 'All rights reserved 2021, Peter Hedenskog and team',
updated: new Date(sortedVersionFiles[0].time), // use the date from the latest updated version file
feedLinks: {
atom: 'https://www.sitespeed.io/feed/atom.xml',
rss: 'https://www.sitespeed.io/feed/rss.xml'
},
author: {
name: 'Peter Hedenskog',
email: 'peter@soulgalore.com',
link: 'https://www.peterhedenskog.com'
}
});
const getContent = async () => {
const content = {};
for (let tool of sortedVersionFiles) {
const changelog =
tool.name === 'sitespeed.io'
? './CHANGELOG.md'
: '../' + tool.name + '/CHANGELOG.md';
const result = await parseChangelog(changelog);
if (result.versions[0].date !== null) {
content[tool.name] = getResult(result.versions[0]);
} else if (result.versions[1]) {
content[tool.name] = getResult(result.versions[1]);
} else {
// skip missing data
console.log(`Missing data for tool ${tool.name}`);
}
}
return content;
};
const descriptions = await getContent();
const images = {
'sitespeed.io': 'https://www.sitespeed.io/img/logos/sitespeed.io.png',
browsertime: 'https://www.sitespeed.io/img/logos/browsertime.png',
'coach-core': 'https://www.sitespeed.io/img/logos/coach.png',
pagexray: 'https://www.sitespeed.io/img/logos/pagexray.png',
throttle: '',
coach: 'https://www.sitespeed.io/img/logos/coach.png',
'chrome-har': '',
'chrome-trace': '',
compare: 'https://www.sitespeed.io/img/logos/compare.png'
};
sortedVersionFiles.forEach(file => {
feed.addItem({
title: `${file.name} ${file.version}`,
id: `https://github.com/sitespeedio/${file.name}/blob/main/CHANGELOG.md#${file.version}`,
link: `https://github.com/sitespeedio/${file.name}/blob/main/CHANGELOG.md#`,
description: descriptions[file.name],
// content: content[file.name],
author: [
{
name: 'Sitespeed.io',
link: 'https://www.sitespeed.io'
}
],
date: new Date(file.time),
image: images[file.name]
});
});
feed.addCategory('Performance');
const docPath = './docs/';
fs.writeFileSync(path.join(docPath, 'feed', 'rss.xml'), feed.rss2());
fs.writeFileSync(path.join(docPath, 'feed', 'atom.xml'), feed.atom1());
}
generateFeed();