From 7893dce5491001e14338415532ab15e32093111c Mon Sep 17 00:00:00 2001 From: chopster44 Date: Thu, 30 Oct 2025 16:19:38 +0000 Subject: [PATCH] functional initial version --- dist/index.cjs.js | 41 ++++++++++++++++++++++++++++++++++++++-- dist/index.d.ts | 5 ++++- dist/index.es.js | 41 ++++++++++++++++++++++++++++++++++++++-- dist/types.d.ts | 6 ++++++ package.json | 1 + src/index.ts | 45 ++++++++++++++++++++++++++++++++++++++++++-- src/types.ts | 6 ++++++ test/archive.test.ts | 9 +++++---- tsconfig.json | 3 ++- vitest.config.ts | 10 ++++++++++ 10 files changed, 155 insertions(+), 12 deletions(-) create mode 100644 dist/types.d.ts create mode 100644 src/types.ts create mode 100644 vitest.config.ts diff --git a/dist/index.cjs.js b/dist/index.cjs.js index 8dffafb..41d5ded 100644 --- a/dist/index.cjs.js +++ b/dist/index.cjs.js @@ -1,5 +1,7 @@ 'use strict'; +var parseXml = require('@rgrove/parse-xml'); + class Updater { archiveURL; feedType; @@ -7,11 +9,46 @@ class Updater { this.archiveURL = archiveURL; this.feedType = feedType; } - async getArchive() { + async getRawArchive() { const res = await fetch(`${this.archiveURL}.${this.feedType}`, { "mode": "cors" }); - return res; + const text = await res.text(); + return text; + } + getVersionDetails(entry) { + let outEntry = { title: "", date: new Date, link: "", html: "" }; + entry.children.forEach((elm) => { + let element = elm; + if (element.name == "title") { + outEntry.title = element.children[0].text; + } + else if (element.name == "date") { + outEntry.date = new Date(element.children[0].text); + } + else if (element.name == "link") { + outEntry.link = element.attributes["href"]; + } + else if (element.name == "content") { + outEntry.html = element.children[0].text; + } + }); + return outEntry; + } + async getArchive() { + const rawArchive = await this.getRawArchive(); + const releaseNotes = parseXml.parseXml(rawArchive); + const output = []; + // console.dir(releaseNotes) + releaseNotes.children[0].children.forEach((elm) => { + if (elm.type == "element") { + const element = elm; + if (element.name == "entry") { + output.push(this.getVersionDetails(element)); + } + } + }); + return output; } } diff --git a/dist/index.d.ts b/dist/index.d.ts index 78fb87b..bed6749 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,6 +1,9 @@ +import * as types from "@/types"; export default class Updater { archiveURL: string; feedType: string; constructor(archiveURL?: string, feedType?: string); - getArchive(): Promise; + private getRawArchive; + private getVersionDetails; + getArchive(): Promise; } diff --git a/dist/index.es.js b/dist/index.es.js index f3fb142..1b032e9 100644 --- a/dist/index.es.js +++ b/dist/index.es.js @@ -1,3 +1,5 @@ +import { parseXml } from '@rgrove/parse-xml'; + class Updater { archiveURL; feedType; @@ -5,11 +7,46 @@ class Updater { this.archiveURL = archiveURL; this.feedType = feedType; } - async getArchive() { + async getRawArchive() { const res = await fetch(`${this.archiveURL}.${this.feedType}`, { "mode": "cors" }); - return res; + const text = await res.text(); + return text; + } + getVersionDetails(entry) { + let outEntry = { title: "", date: new Date, link: "", html: "" }; + entry.children.forEach((elm) => { + let element = elm; + if (element.name == "title") { + outEntry.title = element.children[0].text; + } + else if (element.name == "date") { + outEntry.date = new Date(element.children[0].text); + } + else if (element.name == "link") { + outEntry.link = element.attributes["href"]; + } + else if (element.name == "content") { + outEntry.html = element.children[0].text; + } + }); + return outEntry; + } + async getArchive() { + const rawArchive = await this.getRawArchive(); + const releaseNotes = parseXml(rawArchive); + const output = []; + // console.dir(releaseNotes) + releaseNotes.children[0].children.forEach((elm) => { + if (elm.type == "element") { + const element = elm; + if (element.name == "entry") { + output.push(this.getVersionDetails(element)); + } + } + }); + return output; } } diff --git a/dist/types.d.ts b/dist/types.d.ts new file mode 100644 index 0000000..e554c94 --- /dev/null +++ b/dist/types.d.ts @@ -0,0 +1,6 @@ +export type versionNotes = { + title: string; + date: Date; + link: string; + html: string; +}; diff --git a/package.json b/package.json index bf59a93..0158032 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "test": "vitest" }, "devDependencies": { + "@rgrove/parse-xml": "^4.2.0", "@rollup/plugin-typescript": "^12.1.4", "rollup": "^4.52.5", "tslib": "^2.8.1", diff --git a/src/index.ts b/src/index.ts index e2e9dac..27430ed 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,6 @@ +import * as types from "@/types"; +import { parseXml, XmlDocument, XmlElement, XmlText } from "@rgrove/parse-xml"; + export default class Updater { public archiveURL: string; public feedType: string; @@ -6,11 +9,49 @@ export default class Updater { this.feedType = feedType; } - async getArchive(): Promise { + private async getRawArchive(): Promise { const res = await fetch(`${this.archiveURL}.${this.feedType}`, { "mode": "cors" }); - return res; + const text = await res.text(); + return text; + } + + private getVersionDetails(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 == "date") { + outEntry.date = new Date((element.children[0] as XmlText).text); + } + else if (element.name == "link") { + outEntry.link = element.attributes["href"]; + } else if (element.name == "content") { + outEntry.html = (element.children[0] as XmlText).text; + } + }) + + return outEntry; + } + + public async getArchive(): Promise { + const rawArchive: string = await this.getRawArchive(); + const releaseNotes: XmlDocument = parseXml(rawArchive); + + const output: types.versionNotes[] = []; + // console.dir(releaseNotes) + (releaseNotes.children[0] as XmlElement).children.forEach((elm) => { + if (elm.type == "element") { + const element = elm as XmlElement; + if (element.name == "entry") { + output.push(this.getVersionDetails(element)) + } + } + }); + return output; } } diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..1c4e37a --- /dev/null +++ b/src/types.ts @@ -0,0 +1,6 @@ +export type versionNotes = { + title: string; + date: Date; + link: string; + html: string; +} \ No newline at end of file diff --git a/test/archive.test.ts b/test/archive.test.ts index 6d4deb9..6984a7e 100644 --- a/test/archive.test.ts +++ b/test/archive.test.ts @@ -1,10 +1,11 @@ -import { expect, test } from "vitest"; +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 => { - const updater = new Updater("https://git.emaker.limited/MicrocontrollerCD/SoftwareRelease/releases"); + const updater = new Updater("https://git.emaker.limited/MicrocontrollerCD/SoftwareRelease/releases", "atom"); const res = await updater.getArchive(); - const text = res.text(); - console.log(text); + expectTypeOf(res).toBeArray(); + expectTypeOf(res[0]).toMatchObjectType(); expect(res).not.toBe(null); }); diff --git a/tsconfig.json b/tsconfig.json index 0d1c517..012ccc2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "declaration": true, "declarationDir": "./dist", "paths": { - "rollup/parseAst": ["./node_modules/rollup/dist/parseAst"] + "rollup/parseAst": ["./node_modules/rollup/dist/parseAst"], + "@/*": ["./src/*"] } }, "include": ["src/**/*"], diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..abe5c7b --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; +import path from "path"; + +export default defineConfig({ + resolve: { + alias: { + "@": path.resolve(__dirname, "./src") + } + } +}); \ No newline at end of file