Files
2026-07-13 13:08:41 +08:00

91 lines
2.7 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const { spawnSync } = require("child_process");
const electronRoot = path.join(__dirname, "..");
const nextjsDir = path.join(electronRoot, "..", "servers", "nextjs");
const outDir = path.join(electronRoot, "resources", "nextjs");
const nextBuildDir = path.join(nextjsDir, ".next-build");
const standaloneDir = path.join(nextBuildDir, "standalone");
function rm(p) {
fs.rmSync(p, { recursive: true, force: true });
}
function cpDir(src, dest) {
fs.mkdirSync(path.dirname(dest), { recursive: true });
fs.cpSync(src, dest, { recursive: true });
}
console.log("Running Next.js production build (BUILD_TARGET=electron)…");
rm(outDir);
rm(nextBuildDir);
const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
const build = spawnSync(npmCmd, ["run", "build"], {
cwd: nextjsDir,
env: { ...process.env, BUILD_TARGET: "electron" },
stdio: "inherit",
// Windows: cmd is required to run npm.cmd; without shell, spawnSync can throw EINVAL.
shell: process.platform === "win32",
});
if (build.error) {
console.error(build.error);
process.exit(1);
}
if (build.status !== 0) {
process.exit(build.status ?? 1);
}
if (!fs.existsSync(standaloneDir)) {
console.error("Expected standalone output at:", standaloneDir);
process.exit(1);
}
fs.mkdirSync(path.join(outDir, ".next-build"), { recursive: true });
for (const name of fs.readdirSync(standaloneDir)) {
fs.cpSync(
path.join(standaloneDir, name),
path.join(outDir, name),
{ recursive: true }
);
}
// Next.js 16 standalone traces the app under servers/nextjs/; the server process
// runs from that directory, so static assets and public files must live beside
// server.js — not only at the bundle root (older Next versions used a flatter layout).
const nestedStandaloneDir = path.join(outDir, "servers", "nextjs");
const staticSrc = path.join(nextBuildDir, "static");
const staticDestinations = [
path.join(outDir, ".next-build", "static"),
path.join(nestedStandaloneDir, ".next-build", "static"),
];
if (fs.existsSync(staticSrc)) {
for (const staticDest of staticDestinations) {
cpDir(staticSrc, staticDest);
}
} else {
console.error("Expected Next.js static output at:", staticSrc);
process.exit(1);
}
const publicDir = path.join(nextjsDir, "public");
if (fs.existsSync(publicDir)) {
cpDir(publicDir, path.join(outDir, "public"));
if (fs.existsSync(nestedStandaloneDir)) {
cpDir(publicDir, path.join(nestedStandaloneDir, "public"));
}
}
const templatesSrc = path.join(nextjsDir, "app", "presentation-templates");
const templatesDest = path.join(outDir, "presentation-templates");
if (fs.existsSync(templatesSrc)) {
cpDir(templatesSrc, templatesDest);
}
console.log("Next.js bundle copied to:", outDir);