import { spawnSync } from "node:child_process"; import { copyFileSync, existsSync, mkdirSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const appRoot = path.resolve(__dirname, ".."); const repoRoot = path.resolve(appRoot, ".."); const sidecarProject = path.join( repoRoot, "Journal.Sidecar", "Journal.Sidecar.csproj", ); const publishOutputDir = path.join(repoRoot, "output"); const tauriBinDir = path.join(appRoot, "src-tauri", "bin"); function runtimeForCurrentPlatform() { const arch = process.arch; if (process.platform === "win32") { if (arch === "arm64") return "win-arm64"; return "win-x64"; } if (process.platform === "linux") { if (arch === "arm64") return "linux-arm64"; return "linux-x64"; } if (process.platform === "darwin") { if (arch === "arm64") return "osx-arm64"; return "osx-x64"; } throw new Error(`Unsupported platform '${process.platform}' for sidecar publish.`); } function sidecarFileName() { return process.platform === "win32" ? "Journal.Sidecar.exe" : "Journal.Sidecar"; } const runtime = runtimeForCurrentPlatform(); const sidecarName = sidecarFileName(); const publishedSidecar = path.join(publishOutputDir, sidecarName); const bundledSidecar = path.join(tauriBinDir, sidecarName); console.log(`Publishing sidecar for ${process.platform}/${process.arch} (${runtime})...`); const publishArgs = [ "publish", sidecarProject, "-c", "Release", "-r", runtime, "--self-contained", "-p:PublishSingleFile=true", "-p:IncludeNativeLibrariesForSelfExtract=true", "-p:RestoreIgnoreFailedSources=true", "-p:NuGetAudit=false", "-o", publishOutputDir, ]; const publish = spawnSync("dotnet", publishArgs, { cwd: repoRoot, stdio: "inherit", }); if (publish.error) { throw publish.error; } if (publish.status !== 0) { process.exit(publish.status ?? 1); } if (!existsSync(publishedSidecar)) { throw new Error(`Published sidecar not found: ${publishedSidecar}`); } mkdirSync(tauriBinDir, { recursive: true }); copyFileSync(publishedSidecar, bundledSidecar); console.log(`Staged sidecar for Tauri: ${bundledSidecar}`);