From a4db4c217d6868c90e7aeef068a75f29f2034430 Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 3 Feb 2026 00:50:36 +0800 Subject: [PATCH] feat(route): add gitkraken release note (#21044) --- lib/routes/gitkraken/namespace.ts | 6 +++ lib/routes/gitkraken/release-note.ts | 65 ++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 lib/routes/gitkraken/namespace.ts create mode 100644 lib/routes/gitkraken/release-note.ts diff --git a/lib/routes/gitkraken/namespace.ts b/lib/routes/gitkraken/namespace.ts new file mode 100644 index 000000000..c556d5317 --- /dev/null +++ b/lib/routes/gitkraken/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'GitKraken', + url: 'gitkraken.com', +}; diff --git a/lib/routes/gitkraken/release-note.ts b/lib/routes/gitkraken/release-note.ts new file mode 100644 index 000000000..d59a33486 --- /dev/null +++ b/lib/routes/gitkraken/release-note.ts @@ -0,0 +1,65 @@ +import { load } from 'cheerio'; +import sanitizeHtml from 'sanitize-html'; + +import type { Route } from '@/types'; +import ofetch from '@/utils/ofetch'; +import { parseDate } from '@/utils/parse-date'; + +export const route: Route = { + path: '/release-note', + categories: ['program-update'], + example: '/gitkraken/release-note', + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['help.gitkraken.com/gitkraken-desktop/current/'], + }, + { + source: ['www.gitkraken.com/'], + }, + ], + name: 'Release Notes', + maintainers: ['TonyRL'], + url: 'help.gitkraken.com/gitkraken-desktop/current/', + handler, +}; + +async function handler() { + const baseUrl = 'https://help.gitkraken.com'; + const link = `${baseUrl}/gitkraken-desktop/current/`; + const response = await ofetch(`${baseUrl}/wp-json/wp/v2/posts/1964`); + + const $ = load(response.content.rendered, null, false); + + const items = $('h2') + .toArray() + .map((item) => { + const $item = $(item); + + return { + title: $item.text(), + description: $item + .next() + .nextUntil('hr') + .toArray() + .map((el) => $.html(el)) + .join(''), + link: `${link}#${$item.prev().find('a[id]').attr('id')}`, + pubDate: parseDate($item.next().find('kbd').text()?.split('day, ')[1].trim(), 'MMMM Do, YYYY', 'en'), + }; + }); + + return { + title: response.title.rendered, + description: sanitizeHtml(response.excerpt.rendered, { allowedTags: [], allowedAttributes: {} }), + link, + item: items, + }; +}