/** * @module * * This script is used internally by the `rebuild-deps` target of the `desktop`. Normally we could use * `electron-rebuild` CLI directly, but it would rebuild the monorepo-level dependencies and breaks * the server build (and it doesn't expose a CLI option to override this). * * A side purpose is to generate a fake `package.json` file in the `dist` directory * that contains only the native dependencies. This is used by `electron-forge`. */ import { join, resolve } from "path"; import { rebuild } from "@electron/rebuild" import { readFileSync, rmSync, writeFileSync } from "fs"; const nativeDependencies = [ "better-sqlite3" ]; function parsePackageJson(distDir: string) { const packageJsonPath = join(distDir, "../package.json"); const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); let electronVersion: string; if (process.argv[3]) { electronVersion = process.argv[3]; } else { electronVersion = packageJson?.devDependencies?.electron ?? packageJson?.dependencies?.electron; if (!electronVersion) { console.error(`Unable to retrieve Electron version in '${resolve(packageJsonPath)}'.`); process.exit(3); } } return { electronVersion, packageJson }; } function createFakePackageJson(distPath: string, packageJson: any) { const finalDependencies = {}; for (const dep of nativeDependencies) { finalDependencies[dep] = packageJson.dependencies[dep]; } const fakePackageJson: any = { name: "trilium", version: packageJson.version, main: packageJson.main, author: packageJson.author, license: packageJson.license, description: packageJson.description, dependencies: finalDependencies, devDependencies: { "electron": packageJson.devDependencies?.electron || packageJson.dependencies?.electron, } }; if (packageJson?.config?.forge) { fakePackageJson.config = { forge: join("..", packageJson.config.forge) }; } writeFileSync(distPath, JSON.stringify(fakePackageJson, null, 2), "utf-8"); } function main() { const distDir = resolve(process.argv[2]); if (!distDir) { console.error("Missing root dir as argument."); process.exit(1); } const { electronVersion, packageJson } = parsePackageJson(distDir); const packageJsonPath = join(distDir, "package.json"); createFakePackageJson(packageJsonPath, packageJson); console.log(`Rebuilding ${distDir} with version ${electronVersion}...`); rebuild({ // We force the project root path to avoid electron-rebuild from rebuilding the monorepo-level dependency and breaking the server. projectRootPath: distDir, buildPath: distDir, force: true, electronVersion, }); } main();