journal/Journal.App/scripts/tauri-prebuild.mjs
Jacob Schmidt 0d77300c22 feat: Project Journal backend monorepo
Monorepo with centralized build props, npm workspaces, LlamaSharp AI,
SQLite/SQLCipher storage, Svelte frontend, and unified smoke tests.

Co-Authored-By: Oz <oz-agent@warp.dev>
2026-03-02 20:56:26 -06:00

98 lines
2.5 KiB
JavaScript

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";
}
function publishProject(projectPath, runtime) {
const publishArgs = [
"publish",
projectPath,
"-c",
"Release",
"-r",
runtime,
"--self-contained",
"-p:PublishSingleFile=true",
"-p:IncludeNativeLibrariesForSelfExtract=true",
"-p:IncludeAllContentForSelfExtract=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);
}
}
function stageBinary(fileName) {
const publishedBinary = path.join(publishOutputDir, fileName);
const bundledBinary = path.join(tauriBinDir, fileName);
if (!existsSync(publishedBinary)) {
throw new Error(`Published binary not found: ${publishedBinary}`);
}
mkdirSync(tauriBinDir, { recursive: true });
copyFileSync(publishedBinary, bundledBinary);
console.log(`Staged binary for Tauri: ${bundledBinary}`);
}
const runtime = runtimeForCurrentPlatform();
const sidecarName = sidecarFileName();
console.log(
`Publishing sidecar for ${process.platform}/${process.arch} (${runtime})...`,
);
console.log("Publishing Journal.Sidecar...");
publishProject(sidecarProject, runtime);
stageBinary(sidecarName);