80 lines
3 KiB
JavaScript
80 lines
3 KiB
JavaScript
// 배포 전에 공개 릴리스 저장소의 릴리스 목록을 releases.json 으로 굽는다.
|
|
// (브라우저에서 Forgejo API 를 직접 호출하면 CORS 에 막히므로 빌드 시점에 정적 생성)
|
|
// 사용: node site/fetch-releases.mjs
|
|
import { writeFileSync, readFileSync, existsSync } from "node:fs";
|
|
import { resolve, dirname } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const root = resolve(__dirname, "..");
|
|
const envPath = resolve(root, ".env");
|
|
|
|
// .env 로드 (환경변수가 없을 경우 보완)
|
|
if (existsSync(envPath)) {
|
|
const content = readFileSync(envPath, "utf8");
|
|
for (const line of content.split("\n")) {
|
|
const match = line.match(/^\s*([A-Za-z0-9_]+)\s*=\s*(.*)$/);
|
|
if (match && !process.env[match[1]]) {
|
|
process.env[match[1]] = match[2].trim();
|
|
}
|
|
}
|
|
}
|
|
|
|
const serverUrl = (process.env.FORGEJO_URL || "https://git.chanpaca.net").replace(/\/$/, "");
|
|
const repo = process.env.RELEASE_REPO || "Video-Downloader/releases";
|
|
const API = `${serverUrl}/api/v1/repos/${repo}/releases?limit=50`;
|
|
|
|
const headers = { Accept: "application/json" };
|
|
if (process.env.FORGEJO_TOKEN) {
|
|
headers.Authorization = `token ${process.env.FORGEJO_TOKEN}`;
|
|
} else if (process.env.FORGEJO_USER && process.env.FORGEJO_PASSWORD) {
|
|
const b64 = Buffer.from(`${process.env.FORGEJO_USER}:${process.env.FORGEJO_PASSWORD}`).toString("base64");
|
|
headers.Authorization = `Basic ${b64}`;
|
|
}
|
|
|
|
const includeDraft = process.env.INCLUDE_DRAFT === "true";
|
|
|
|
try {
|
|
const res = await fetch(API, { headers });
|
|
if (!res.ok) throw new Error(`릴리스 API 실패: HTTP ${res.status}`);
|
|
const raw = await res.json();
|
|
|
|
const releases = (Array.isArray(raw) ? raw : [])
|
|
.filter((r) => includeDraft || !r.draft)
|
|
.sort((a, b) => new Date(b.published_at || b.created_at) - new Date(a.published_at || a.created_at))
|
|
.map((r) => ({
|
|
tag: r.tag_name,
|
|
name: r.name || r.tag_name,
|
|
published_at: r.published_at || r.created_at,
|
|
prerelease: r.prerelease,
|
|
draft: r.draft,
|
|
notes: r.body || "",
|
|
assets: (r.assets || []).map((a) => ({
|
|
name: a.name,
|
|
size: a.size,
|
|
url: a.browser_download_url,
|
|
})),
|
|
}));
|
|
|
|
const publicServerUrl = process.env.FORGEJO_PUBLIC_URL || "https://git.chanpaca.net";
|
|
const out = {
|
|
generated_at: new Date().toISOString(),
|
|
repo_url: `${publicServerUrl.replace(/\/$/, "")}/${repo}`,
|
|
releases,
|
|
};
|
|
|
|
writeFileSync(new URL("./releases.json", import.meta.url), JSON.stringify(out, null, 2));
|
|
console.log(`releases.json 생성 완료: 릴리스 ${releases.length}건 (저장소: ${repo})`);
|
|
} catch (err) {
|
|
console.error(`릴리스 정보 로드 실패: ${err.message}`);
|
|
// 기존 releases.json 이 없으면 빈 파일 생성
|
|
const outPath = resolve(__dirname, "releases.json");
|
|
if (!existsSync(outPath)) {
|
|
const fallback = {
|
|
generated_at: new Date().toISOString(),
|
|
repo_url: `${serverUrl}/${repo}`,
|
|
releases: [],
|
|
};
|
|
writeFileSync(outPath, JSON.stringify(fallback, null, 2));
|
|
}
|
|
}
|