/**
* Pass --generate-json to generate JSON data file
* @author sahithyandev
*/
const fs = require("fs-extra");
const options = {
SOURCE_FILE: "changelog.txt",
DATA_FILE: "changelog-data.json",
OUTPUT_FILE: "changelog.md",
};
function extractVersionArray(versionLines = []) {
const versionsObj = {};
let currentVersion = "";
versionLines.forEach((line) => {
if (line.startsWith("[")) {
currentVersion = line;
} else {
let prevItems = versionsObj[currentVersion] || [];
versionsObj[currentVersion] = [...prevItems, line.slice(4)];
}
});
// versionObj will be in this format
// {
// "version-title": [
// "entry-1",
// "entry-2"
// ]
// }
return Object.entries(versionsObj).map(
([versionTitle, versionEntries]) => ({
versionTitle,
versionEntries,
})
);
}
function extractData() {
const source = fs.readFileSync(options.SOURCE_FILE, "utf-8");
const jsonData = {
currentVersion: source.match(/- Version (\d\.\d\.\d) -/)[1],
versions: [],
};
let versionData = source
.split("\n")
.filter((line) => line != "")
.slice(4);
jsonData.versions = extractVersionArray(versionData);
if (process.argv.includes("--generate-json")) {
fs.writeFileSync(options.DATA_FILE, JSON.stringify(jsonData, null, 4));
}
return jsonData;
}
function writeMD(
data = {
currentVersion: "",
versions: [],
}
) {
let outputLines = [
`# JokeAPI Changelog (Version ${data["currentVersion"]})`,
"",
];
data.versions.forEach((versionObj) => {
let versionContent = [
"
\n\n## " + versionObj.versionTitle,
...versionObj.versionEntries,
];
outputLines.push(...versionContent, "\n");
});
fs.writeFileSync(
options.OUTPUT_FILE,
outputLines
.join("\n")
// convert issue references to links
.replace(
/issue #(\d{1,})/g,
"[issue #$1](https://github.com/Sv443-Network/JokeAPI/issues/$1)"
)
// convert pull request references to links
.replace(
/PR #(\d{1,})/g,
"[pull request #$1](https://github.com/Sv443-Network/JokeAPI/pull/$1)"
)
+ `
\n\nThis file was auto-generated from the source file at [./${options.SOURCE_FILE}](./${options.SOURCE_FILE})`
);
console.log(`\x1b[32m\x1b[1mGenerated changelog at ./${options.OUTPUT_FILE}\n\x1b[0m`);
}
function generateMD() {
const data = extractData();
writeMD(data);
}
generateMD();