sync-markdown.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /** Sync Markdown files in /bench based on the data from bench.json */
  2. import { BenchData, BenchResult, Markdown } from "./utils";
  3. (async () => {
  4. const bench = await BenchData.open();
  5. await BenchData.forEachMarkdown((markdown, fileName) => {
  6. const resultType = fileName
  7. .toLowerCase()
  8. .replace(".md", "")
  9. .replace(/_\w/g, (match) => match[1].toUpperCase()) as keyof BenchResult;
  10. const versions = bench.getVersions();
  11. // On the first version, compare with itself to update it with no changes
  12. versions.unshift(versions[0]);
  13. for (const i in versions) {
  14. const currentVersion = versions[i];
  15. if (currentVersion === "unreleased") return;
  16. const nextVersion = versions[+i + 1];
  17. const newData = bench.get(nextVersion);
  18. const oldData = bench.get(currentVersion);
  19. // Create table
  20. const table = Markdown.createTable();
  21. bench.compare({
  22. newResult: newData.result[resultType],
  23. oldResult: oldData.result[resultType],
  24. changeCb: ({ name, newValue, oldValue }) => {
  25. if (newValue === null) {
  26. // Deleted key
  27. return;
  28. }
  29. let changeText: string;
  30. if (oldValue === null) {
  31. // New key
  32. changeText = "N/A";
  33. } else {
  34. const delta = (newValue - oldValue).toLocaleString();
  35. const percentChange = ((newValue / oldValue - 1) * 100).toFixed(2);
  36. if (+percentChange > 0) {
  37. changeText = `🔴 **+${delta} (${percentChange}%)**`;
  38. } else {
  39. changeText = `🟢 **${delta} (${percentChange.slice(1)}%)**`;
  40. }
  41. }
  42. table.insert(name, newValue.toLocaleString(), changeText);
  43. },
  44. noChangeCb: ({ name, value }) => {
  45. table.insert(name, value.toLocaleString(), +i === 0 ? "N/A" : "-");
  46. },
  47. });
  48. // Update version data
  49. markdown.updateVersion({
  50. version: nextVersion,
  51. solanaVersion: newData.solanaVersion,
  52. table,
  53. });
  54. }
  55. });
  56. })();