From 7345d5addf90a4e4a6c3a4a45334c3034e79e377 Mon Sep 17 00:00:00 2001 From: chopster44 Date: Thu, 30 Oct 2025 17:03:07 +0000 Subject: [PATCH] rss parser --- package.json | 2 +- src/index.ts | 54 ++++++++++++++++++++++++++++++++++++++++---- src/types.ts | 2 +- test/archive.test.ts | 19 +++++++++++++--- 4 files changed, 68 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index c84b373..2eebddc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "updaterweblibrary", - "version": "1.0.3", + "version": "1.0.4", "description": "OTA Updater App frontend library", "repository": { "type": "git", diff --git a/src/index.ts b/src/index.ts index 27430ed..49b6a7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ import { parseXml, XmlDocument, XmlElement, XmlText } from "@rgrove/parse-xml"; export default class Updater { public archiveURL: string; public feedType: string; - constructor(archiveURL: string = "/", feedType: string = "rss") { + constructor(archiveURL: string = "/", feedType: string = "atom") { this.archiveURL = archiveURL; this.feedType = feedType; } @@ -17,7 +17,8 @@ export default class Updater { return text; } - private getVersionDetails(entry: XmlElement): types.versionNotes { + // atom feeds + private atomGetVersionDetails(entry: XmlElement): types.versionNotes { let outEntry: types.versionNotes = {title: "", date: new Date, link: "", html: ""}; entry.children.forEach((elm) => { let element = elm as XmlElement; @@ -37,7 +38,7 @@ export default class Updater { return outEntry; } - public async getArchive(): Promise { + private async atomGetArchive(): Promise { const rawArchive: string = await this.getRawArchive(); const releaseNotes: XmlDocument = parseXml(rawArchive); @@ -47,11 +48,56 @@ export default class Updater { if (elm.type == "element") { const element = elm as XmlElement; if (element.name == "entry") { - output.push(this.getVersionDetails(element)) + output.push(this.atomGetVersionDetails(element)) } } }); return output; } + + // rss feeds + private rssGetVersionDetails(entry: XmlElement): types.versionNotes { + let outEntry: types.versionNotes = {title: "", date: new Date, link: "", html: ""}; + entry.children.forEach((elm) => { + let element = elm as XmlElement; + if (element.name == "title") { + outEntry.title = (element.children[0] as XmlText).text; + } + else if (element.name == "pubDate") { + outEntry.date = (element.children[0] as XmlText).text; + } + else if (element.name == "link") { + outEntry.link = (element.children[0] as XmlText).text; + } else if (element.name == "content") { + outEntry.html = (element.children[0] as XmlText).text; + } + }) + + return outEntry; + } + + private async rssGetArchive(): Promise { + const rawArchive: string = await this.getRawArchive(); + const releaseNotes: XmlDocument = parseXml(rawArchive); + + const output: types.versionNotes[] = []; + ((releaseNotes.children[0] as XmlElement).children[1] as XmlElement).children.forEach((elm) => { + if (elm.type == "element") { + const element = elm as XmlElement; + if (element.name == "item") { + output.push(this.atomGetVersionDetails(element)) + } + } + }) + return output; + } + + public async getArchive(): Promise { + if (this.feedType == "atom") { + return this.atomGetArchive() + } else if (this.feedType == "rss"){ + return this.rssGetArchive() + } + } } diff --git a/src/types.ts b/src/types.ts index 1c4e37a..8419d35 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,6 @@ export type versionNotes = { title: string; - date: Date; + date: Date | string; link: string; html: string; } \ No newline at end of file diff --git a/test/archive.test.ts b/test/archive.test.ts index 6984a7e..1fac9a6 100644 --- a/test/archive.test.ts +++ b/test/archive.test.ts @@ -2,10 +2,23 @@ import { expect, expectTypeOf, test } from "vitest"; import Updater from "../src/index.ts"; import * as types from "../src/types.ts"; -test("get archive from gitea", async (): Promise => { +test("get an atom feed from gitea", async (): Promise => { const updater = new Updater("https://git.emaker.limited/MicrocontrollerCD/SoftwareRelease/releases", "atom"); const res = await updater.getArchive(); - expectTypeOf(res).toBeArray(); - expectTypeOf(res[0]).toMatchObjectType(); expect(res).not.toBe(null); + expect(res.length).toBeGreaterThan(0); +}); + +test("get an rss feed from gitea", async(): Promise => { + const updater = new Updater("https://git.emaker.limited/MicrocontrollerCD/SoftwareRelease/releases", "rss"); + const res = await updater.getArchive(); + expect(res).not.toBe(null); + expect(res.length).toBeGreaterThan(0); +}); + +test("get an atom feed from github", async (): Promise => { + const updater = new Updater("https://github.com/chopster44/Phaser_3_pong/releases", "atom"); + const res = await updater.getArchive(); + expect(res).not.toBe(null); + expect(res.length).toBeGreaterThan(0); });