Files

85 lines
2.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// server/publish.mjs — "Yayınla" pipeline: DB -> JSON files -> vite-ssg build -> dist swap
import fs from "node:fs";
import path from "node:path";
import { spawn } from "node:child_process";
import { fileURLToPath } from "node:url";
import { exportToFiles } from "./db.mjs";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const ROOT = path.resolve(__dirname, "..");
export const DIST_DIR = path.join(ROOT, "dist");
const STAGING_DIR = path.join(ROOT, ".dist-staging");
const LOG_LIMIT = 60_000;
const job = {
running: false,
startedAt: null,
finishedAt: null,
ok: null,
log: "",
};
function append(text) {
job.log = (job.log + text).slice(-LOG_LIMIT);
}
function run(cmd, args, opts = {}) {
return new Promise((resolve, reject) => {
const child = spawn(cmd, args, {
cwd: ROOT,
env: { ...process.env, ...opts.env },
shell: false,
});
child.stdout.on("data", (d) => append(d.toString()));
child.stderr.on("data", (d) => append(d.toString()));
child.on("error", reject);
child.on("close", (code) => {
code === 0
? resolve()
: reject(new Error(`${cmd} exited with code ${code}`));
});
});
}
export function getPublishState() {
return { ...job };
}
// Kick off the publish pipeline in the background. Returns false if already running.
export function startPublish() {
if (job.running) return false;
job.running = true;
job.ok = null;
job.log = "";
job.startedAt = new Date().toISOString();
job.finishedAt = null;
(async () => {
try {
append("[1/3] DB → JSON dosyaları aktarılıyor...\n");
const written = await exportToFiles();
append(` ${written.length} dosya yazıldı\n`);
append("[2/3] Site build ediliyor (vite-ssg)...\n");
fs.rmSync(STAGING_DIR, { recursive: true, force: true });
await run("npx", ["vite-ssg", "build"], {
env: { BUILD_OUT_DIR: STAGING_DIR },
});
append("[3/3] dist güncelleniyor...\n");
fs.rmSync(DIST_DIR, { recursive: true, force: true });
fs.renameSync(STAGING_DIR, DIST_DIR);
append("Tamamlandı ✓\n");
job.ok = true;
} catch (e) {
append(`\nHATA: ${e.message}\n`);
job.ok = false;
} finally {
job.running = false;
job.finishedAt = new Date().toISOString();
}
})();
return true;
}