From 14666c8a8e0500719d81708eb66d6e6d2442f6b8 Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Thu, 19 Mar 2026 15:50:46 -0700 Subject: [PATCH] Feat: Extract GitHub API logic --- src/github.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/github.js diff --git a/src/github.js b/src/github.js new file mode 100644 index 0000000..e568f56 --- /dev/null +++ b/src/github.js @@ -0,0 +1,24 @@ +import { USER } from './user.js'; + +export const ghApi = async (path, method = 'GET', body = null) => { + const t = USER.githubToken; + if (!t) throw new Error('No GH token'); + const r = await fetch(`https://api.github.com/repos/${path}`, { + method, + headers: { + 'Authorization': `token ${t}`, + 'Accept': 'application/vnd.github.v3+json', + 'Content-Type': 'application/json' + }, + body: body ? JSON.stringify(body) : null + }); + if (!r.ok && r.status !== 404) throw new Error(`GH API ${r.status}`); + return r.status === 404 ? null : r.json(); +}; + +export const parseGhUrl = u => { + const p = u.substring(5).split('/'), owner = p[0], repoPart = p[1] || '', + branch = repoPart.includes('@') ? repoPart.split('@')[1] : 'main', + repo = repoPart.split('@')[0], path = p.slice(2).join('/').replace(/\/$/, ''); + return { owner, repo, branch, path, apiPath: `${owner}/${repo}/contents${path ? '/' + path : ''}` }; +};