Files
Trilium/scripts/electron-rebuild.mts
2026-04-04 22:01:43 +03:00

74 lines
2.7 KiB
TypeScript

import { join, resolve } from "path";
import { cpSync, existsSync, mkdirSync, readFileSync, rmSync } from "fs";
import { execSync } from "child_process";
import { rebuild } from "@electron/rebuild"
import { isNixOS } from "./utils.mjs";
const workspaceRoot = join(import.meta.dirname, "..");
// On NixOS, re-execute this script inside `nix develop` to get access to Python and other build tools.
// Skip this if we're already inside a nix shell or a nix build (NIX_BUILD_TOP is set during `nix build`).
if (isNixOS() && !process.env.IN_NIX_SHELL && !process.env.NIX_BUILD_TOP) {
console.log("Detected NixOS, re-running electron-rebuild inside 'nix develop'...");
try {
execSync("nix develop -c pnpm exec tsx scripts/electron-rebuild.mts", {
cwd: workspaceRoot,
stdio: "inherit",
env: { ...process.env, IN_NIX_SHELL: "1" }
});
process.exit(0);
} catch (e) {
console.error("Failed to run electron-rebuild inside 'nix develop'.");
process.exit(1);
}
}
function copyNativeDependencies(projectRoot: string) {
const destPath = join(projectRoot, "node_modules/better-sqlite3");
if (existsSync(destPath)) {
rmSync(destPath, { recursive: true });
}
mkdirSync(destPath, { recursive: true });
const sourcePath = join(workspaceRoot, "node_modules/better-sqlite3");
if (!existsSync(sourcePath)) {
console.warn("Nothing to rebuild as source path is missing:", sourcePath);
console.info("For CI builds with filtered package installs, this is normal. For normal development, it's not.");
process.exit(0);
}
cpSync(sourcePath, destPath, { recursive: true, dereference: true });
}
async function rebuildNativeDependencies(projectRoot: string) {
const electronVersion = determineElectronVersion(projectRoot);
if (!electronVersion) {
console.error("Unable to determine Electron version.");
process.exit(1);
}
const targetArch = process.env.TARGET_ARCH || process.arch;
console.log(`Rebuilding ${projectRoot} with ${electronVersion} for ${targetArch}...`);
const resolvedPath = resolve(projectRoot);
await rebuild({
projectRootPath: resolvedPath,
buildPath: resolvedPath,
electronVersion,
arch: targetArch,
force: true
});
}
function determineElectronVersion(projectRoot: string) {
const packageJson = JSON.parse(readFileSync(join(projectRoot, "package.json"), "utf-8"));
console.log("Using Electron version from package.json");
return packageJson.devDependencies.electron;
}
for (const projectRoot of [ "apps/desktop", "apps/edit-docs" ]) {
copyNativeDependencies(projectRoot);
await rebuildNativeDependencies(projectRoot);
}