generate-changelog.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /**
  2. * Pass --generate-json to generate JSON data file
  3. * @author sahithyandev
  4. */
  5. const fs = require("fs-extra");
  6. const options = {
  7. SOURCE_FILE: "changelog.txt",
  8. DATA_FILE: "changelog-data.json",
  9. OUTPUT_FILE: "changelog.md",
  10. };
  11. function extractVersionArray(versionLines = []) {
  12. const versionsObj = {};
  13. let currentVersion = "";
  14. versionLines.forEach((line) => {
  15. if (line.startsWith("[")) {
  16. currentVersion = line;
  17. } else {
  18. let prevItems = versionsObj[currentVersion] || [];
  19. versionsObj[currentVersion] = [...prevItems, line.slice(4)];
  20. }
  21. });
  22. // versionObj will be in this format
  23. // {
  24. // "version-title": [
  25. // "entry-1",
  26. // "entry-2"
  27. // ]
  28. // }
  29. return Object.entries(versionsObj).map(
  30. ([versionTitle, versionEntries]) => ({
  31. versionTitle,
  32. versionEntries,
  33. })
  34. );
  35. }
  36. function extractData() {
  37. const source = fs.readFileSync(options.SOURCE_FILE, "utf-8");
  38. const jsonData = {
  39. currentVersion: source.match(/- Version (\d\.\d\.\d) -/)[1],
  40. versions: [],
  41. };
  42. let versionData = source
  43. .split("\n")
  44. .filter((line) => line != "")
  45. .slice(4);
  46. jsonData.versions = extractVersionArray(versionData);
  47. if (process.argv.includes("--generate-json")) {
  48. fs.writeFileSync(options.DATA_FILE, JSON.stringify(jsonData, null, 4));
  49. }
  50. return jsonData;
  51. }
  52. function writeMD(
  53. data = {
  54. currentVersion: "",
  55. versions: [],
  56. }
  57. ) {
  58. let outputLines = [
  59. `# JokeAPI Changelog (Version ${data["currentVersion"]})`,
  60. "",
  61. ];
  62. data.versions.forEach((versionObj) => {
  63. let versionContent = [
  64. "<br><br><br>\n\n## " + versionObj.versionTitle,
  65. ...versionObj.versionEntries,
  66. ];
  67. outputLines.push(...versionContent, "\n");
  68. });
  69. fs.writeFileSync(
  70. options.OUTPUT_FILE,
  71. outputLines
  72. .join("\n")
  73. // convert issue references to links
  74. .replace(
  75. /issue #(\d{1,})/g,
  76. "[issue #$1](https://github.com/Sv443-Network/JokeAPI/issues/$1)"
  77. )
  78. // convert pull request references to links
  79. .replace(
  80. /PR #(\d{1,})/g,
  81. "[pull request #$1](https://github.com/Sv443-Network/JokeAPI/pull/$1)"
  82. )
  83. + `<br><br><br>\n\nThis file was auto-generated from the source file at [./${options.SOURCE_FILE}](./${options.SOURCE_FILE})`
  84. );
  85. console.log(`\x1b[32m\x1b[1mGenerated changelog at ./${options.OUTPUT_FILE}\n\x1b[0m`);
  86. }
  87. function generateMD() {
  88. const data = extractData();
  89. writeMD(data);
  90. }
  91. generateMD();