import { existsSync, readFileSync } from "node:fs"; import path from "node:path"; import { spawn } from "node:child_process"; import { electronCache, electronRoot, getNpmCommand, nodecgRuntimeRoot, runtimeNpmCache } from "./build-config.mjs"; const packageJson = JSON.parse(readFileSync(path.join(electronRoot, "package.json"), "utf8")); const electronVersion = packageJson.devDependencies?.electron ?? packageJson.dependencies?.electron; if (!electronVersion) { console.error("Could not determine Electron version from package.json."); process.exit(1); } if (!existsSync(path.join(nodecgRuntimeRoot, "package.json"))) { console.error("No packaged NodeCG runtime found. Run npm run prepare:runtime first."); process.exit(1); } /** @returns {Promise} */ function run(command, args, cwd) { return new Promise((resolve, reject) => { const child = spawn(command, args, { cwd, stdio: "inherit", shell: process.platform === "win32", env: { ...process.env, npm_config_runtime: "electron", npm_config_target: electronVersion, npm_config_disturl: "https://electronjs.org/headers", npm_config_cache: runtimeNpmCache, ELECTRON_CACHE: electronCache, }, }); child.on("exit", (code) => { if (code === 0) { resolve(); } else { reject(new Error(`${command} ${args.join(" ")} failed with code ${code}`)); } }); }); } console.log(`\n[rebuild-native] Rebuilding better-sqlite3 for Electron ${electronVersion} in: ${nodecgRuntimeRoot}`); await run(getNpmCommand(), [ "rebuild", "better-sqlite3", "--runtime=electron", `--target=${electronVersion}`, "--dist-url=https://electronjs.org/headers", ], nodecgRuntimeRoot); console.log("\n[rebuild-native] Done.");