From 29bcf4188b8c89c663472655fb558408385ad182 Mon Sep 17 00:00:00 2001 From: Simone Corsi Date: Sat, 16 Jan 2021 12:05:48 +0100 Subject: [PATCH] chore: moved helpers in own file --- src/helpers.ts | 89 +++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 98 ++++++++------------------------------------------ 2 files changed, 104 insertions(+), 83 deletions(-) create mode 100644 src/helpers.ts diff --git a/src/helpers.ts b/src/helpers.ts new file mode 100644 index 0000000..b515175 --- /dev/null +++ b/src/helpers.ts @@ -0,0 +1,89 @@ +import ejs from 'ejs'; +import * as core from '@actions/core'; +import remark from 'remark'; +import toc from 'remark-toc'; + +import MD_TEMPLATE from './template'; +import GithubApi from './api'; +import link from './link'; +import git from './git'; + +import type { PaginationLink, ApiGetStarResponse } from './types'; + +import fs from 'fs'; + +const fsp = fs.promises; + +export function wait(time = 200): Promise { + return new Promise((resolve) => setTimeout(resolve, time)); +} + +export function isLastPage(links: PaginationLink): boolean { + return links.next === links.last; +} + +export async function renderer( + data: { [key: string]: any }, + templateString = MD_TEMPLATE +): Promise { + try { + return ejs.render(templateString, data); + } catch (error) { + core.error('#renderer'); + core.error(error); + process.exit(1); + } +} + +export async function apiGetStar(url: string): Promise { + const { headers, body }: any = await GithubApi.get(url); + return { + data: body, + links: link.parse(headers.link).refs.reduce( + (acc, val) => ({ + ...acc, + [val.rel]: val.uri, + }), + {} + ), + }; +} + +export const REPO_USERNAME = process.env.GITHUB_REPOSITORY?.split('/')[0]; +export const API_STARRED_URL = `${process.env.GITHUB_API_URL}/users/${REPO_USERNAME}/starred`; + +let links: PaginationLink = { + next: API_STARRED_URL, + last: undefined, +}; +export async function paginate(): Promise { + if (!isLastPage(links)) return null; + const r = await apiGetStar(links.next); + links = r.links; + return r; +} + +export function generateMd(data: string): Promise { + return new Promise((resolve) => { + remark() + .use(toc) + .process(data, function (error, file) { + if (error) { + core.error('#generateMd'); + core.error(error); + return resolve(''); + } + return resolve(String(file)); + }); + }); +} + +export const OUTPUT_FILENAME: string = + core.getInput('output-filename') || 'README.md'; +export async function pushNewFile(markdown: string): Promise { + await fsp.writeFile(OUTPUT_FILENAME, markdown); + await git.pull(); + await git.add(OUTPUT_FILENAME); + await git.commit(`chore(${OUTPUT_FILENAME}): updated ${OUTPUT_FILENAME}`); + await git.push(); +} diff --git a/src/index.ts b/src/index.ts index 2cbee50..a6542f1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,86 +1,24 @@ -import fs from 'fs'; -import ejs from 'ejs'; -import remark from 'remark'; -import toc from 'remark-toc'; import * as core from '@actions/core'; -import GithubApi from './api'; -import link from './link'; -import git from './git'; -import MD_TEMPLATE from './template'; +import { + renderer, + paginate, + REPO_USERNAME, + generateMd, + pushNewFile, +} from './helpers'; -import type { - SortedLanguageList, - PaginationLink, - Stars, - Star, - ApiGetStarResponse, -} from './types'; - -const fsp = fs.promises; - -const OUTPUT_FILENAME: string = core.getInput('output-filename') || 'README.md'; -const REPO_USERNAME = process.env.GITHUB_REPOSITORY?.split('/')[0]; -const API_STARRED_URL = `${process.env.GITHUB_API_URL}/users/${REPO_USERNAME}/starred`; - -const renderer = async (data: any, templateString = MD_TEMPLATE) => { - try { - return ejs.render(templateString, data); - } catch (error) { - core.error('#renderer'); - core.error(error); - process.exit(1); - } -}; - -const wait = (time = 200) => - new Promise((resolve) => setTimeout(resolve, time)); - -async function apiGetStar(url: string): Promise { - const { headers, body }: any = await GithubApi.get(url); - return { - data: body, - links: link.parse(headers.link).refs.reduce( - (acc, val) => ({ - ...acc, - [val.rel]: val.uri, - }), - {} - ), - }; -} - -function isLastPage(links: PaginationLink): boolean { - return links.next === links.last; -} - -export function generateMd(data: string): Promise { - return new Promise((resolve) => { - remark() - .use(toc) - .process(data, function (error, file) { - if (error) { - core.error('#generateMd'); - core.error(error); - return resolve(''); - } - return resolve(String(file)); - }); - }); -} +import type { SortedLanguageList, Stars, Star } from './types'; export async function main(): Promise { - let links: PaginationLink = { - next: API_STARRED_URL, - last: undefined, - }; let results: Stars = []; - do { - const r = await apiGetStar(links.next); - links = r.links; + + while (true) { + // sorry. + const r = await paginate(); + if (!r || r === null) break; results = results.concat(r.data); - await wait(); - } while (!isLastPage(links)); + } const sortedByLanguages = results.reduce( (acc: SortedLanguageList, val: Star) => { @@ -103,13 +41,7 @@ export async function main(): Promise { const markdown: string = await generateMd(rendered); - await fsp.writeFile(OUTPUT_FILENAME, markdown); - - await git.add(OUTPUT_FILENAME); - - await git.commit(`chore(${OUTPUT_FILENAME}): updated ${OUTPUT_FILENAME}`); - - await git.push(); + await pushNewFile(markdown); } export async function run(): Promise {