93 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /*
 | |
|  * SPDX-License-Identifier: GPL-3.0
 | |
|  * Vesktop, a desktop app aiming to give you a snappier Discord Experience
 | |
|  * Copyright (c) 2023 Vendicated and Vencord contributors
 | |
|  */
 | |
| 
 | |
| import { promises as fs } from "node:fs";
 | |
| 
 | |
| import { DOMParser, XMLSerializer } from "@xmldom/xmldom";
 | |
| import xmlFormat from "xml-formatter";
 | |
| 
 | |
| function generateDescription(description: string, descriptionNode: Element) {
 | |
|     const lines = description.replace(/\r/g, "").split("\n");
 | |
|     let currentList: Element | null = null;
 | |
| 
 | |
|     for (let i = 0; i < lines.length; i++) {
 | |
|         const line = lines[i];
 | |
| 
 | |
|         if (line.includes("New Contributors")) {
 | |
|             // we're done, don't parse any more since the new contributors section is the last one
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|         if (line.startsWith("## ")) {
 | |
|             const pNode = descriptionNode.ownerDocument.createElement("p");
 | |
|             pNode.textContent = line.slice(3);
 | |
|             descriptionNode.appendChild(pNode);
 | |
|         } else if (line.startsWith("* ")) {
 | |
|             const liNode = descriptionNode.ownerDocument.createElement("li");
 | |
|             liNode.textContent = line.slice(2).split("in https://github.com")[0].trim(); // don't include links to github
 | |
| 
 | |
|             if (!currentList) {
 | |
|                 currentList = descriptionNode.ownerDocument.createElement("ul");
 | |
|             }
 | |
| 
 | |
|             currentList.appendChild(liNode);
 | |
|         }
 | |
| 
 | |
|         if (currentList && !lines[i + 1].startsWith("* ")) {
 | |
|             descriptionNode.appendChild(currentList);
 | |
|             currentList = null;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| const latestReleaseInformation = await fetch("https://api.github.com/repos/Vencord/Vesktop/releases/latest", {
 | |
|     headers: {
 | |
|         Accept: "application/vnd.github+json",
 | |
|         "X-Github-Api-Version": "2022-11-28"
 | |
|     }
 | |
| }).then(res => res.json());
 | |
| 
 | |
| const metaInfo = await fs.readFile("./meta/dev.vencord.Vesktop.metainfo.xml", "utf-8");
 | |
| 
 | |
| const parser = new DOMParser().parseFromString(metaInfo, "text/xml");
 | |
| 
 | |
| const releaseList = parser.getElementsByTagName("releases")[0];
 | |
| 
 | |
| for (let i = 0; i < releaseList.childNodes.length; i++) {
 | |
|     const release = releaseList.childNodes[i] as Element;
 | |
| 
 | |
|     if (release.nodeType === 1 && release.getAttribute("version") === latestReleaseInformation.name) {
 | |
|         console.log("Latest release already added, nothing to be done");
 | |
|         process.exit(0);
 | |
|     }
 | |
| }
 | |
| 
 | |
| const release = parser.createElement("release");
 | |
| release.setAttribute("version", latestReleaseInformation.name);
 | |
| release.setAttribute("date", latestReleaseInformation.published_at.split("T")[0]);
 | |
| release.setAttribute("type", "stable");
 | |
| 
 | |
| const releaseUrl = parser.createElement("url");
 | |
| releaseUrl.textContent = latestReleaseInformation.html_url;
 | |
| 
 | |
| release.appendChild(releaseUrl);
 | |
| 
 | |
| const description = parser.createElement("description");
 | |
| 
 | |
| // we're not using a full markdown parser here since we don't have a lot of formatting options to begin with
 | |
| generateDescription(latestReleaseInformation.body, description);
 | |
| 
 | |
| release.appendChild(description);
 | |
| 
 | |
| releaseList.insertBefore(release, releaseList.childNodes[0]);
 | |
| 
 | |
| const output = xmlFormat(new XMLSerializer().serializeToString(parser), {
 | |
|     lineSeparator: "\n",
 | |
|     collapseContent: true,
 | |
|     indentation: "  "
 | |
| });
 | |
| 
 | |
| await fs.writeFile("./meta/dev.vencord.Vesktop.metainfo.xml", output, "utf-8");
 | 
