diff --git a/scripts/utils.ts b/scripts/utils.ts new file mode 100644 index 00000000..eb783540 --- /dev/null +++ b/scripts/utils.ts @@ -0,0 +1,59 @@ +import { join, resolve } from 'node:path' +import fs from 'fs-extra' +import Git from 'simple-git' +import { $fetch } from 'ohmyfetch' + +export const git = Git() + +export const DOCS_URL = 'https://note.toshiki.dev/' + +export const DIR_ROOT = resolve(__dirname, '..') +export const DIR_SRC = resolve(__dirname, '../docs') + +export function replacer(code: string, value: string, key: string, insert: 'head' | 'tail' | 'none' = 'none') { + const START = `` + const END = `` + const regex = new RegExp(`${START}[\\s\\S]*?${END}`, 'im') + + const target = value ? `${START}\n${value}\n${END}` : `${START}${END}` + + if (!code.match(regex)) { + if (insert === 'none') + return code + else if (insert === 'head') + return `${target}\n\n${code}` + else + return `${code}\n\n${target}` + } + + return code.replace(regex, target) +} + +export function uniq(a: T) { + return Array.from(new Set(a)) +} + +async function fetchContributors(page = 1) { + const additional = ['andatoshiki', 'chenskiro'] + + const collaborators: string[] = [] + const data = await $fetch<{ login: string }[]>(`https://api.github.com/repos/andatoshiki/toshiki-notebook/contributors?per_page=100&page=${page}`, { + method: 'get', + headers: { + 'content-type': 'application/json', + }, + }) || [] + collaborators.push(...data.map(i => i.login)) + if (data.length === 100) + collaborators.push(...(await fetchContributors(page + 1))) + + return Array.from(new Set([ + ...collaborators.filter(collaborator => !['renovate[bot]', 'dependabot[bot]', 'renovate-bot', 'github-actions[bot]'].includes(collaborator)), + ...additional, + ])) +} + +export async function updateContributors() { + const collaborators = await fetchContributors() + await fs.writeFile(join(DIR_SRC, './contributors.json'), `${JSON.stringify(collaborators, null, 2)}\n`, 'utf8') +}