Files
yaak-mountain-loop/scripts/run-dev.mjs
2026-03-06 09:20:49 -08:00

117 lines
3.0 KiB
JavaScript

#!/usr/bin/env node
/**
* Script to run a Tauri app dev server with dynamic port configuration.
*/
import { spawnSync } from "child_process";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const rootDir = path.join(__dirname, "..");
// Load .env.local if it exists
const envLocalPath = path.join(rootDir, ".env.local");
if (fs.existsSync(envLocalPath)) {
const envContent = fs.readFileSync(envLocalPath, "utf8");
const envVars = envContent
.split("\n")
.filter((line) => line && !line.startsWith("#"))
.reduce((acc, line) => {
const [key, value] = line.split("=");
if (key && value) {
acc[key.trim()] = value.trim();
}
return acc;
}, {});
Object.assign(process.env, envVars);
}
const [appName = "client", ...additionalArgs] = process.argv.slice(2);
const appConfigs = {
client: {
appDir: "crates-tauri/yaak-app-client",
devPortEnv: "YAAK_CLIENT_DEV_PORT",
fallbackDevPortEnv: "YAAK_DEV_PORT",
defaultPort: "1420",
tauriConfig: "tauri.conf.json",
tauriDevConfig: "tauri.development.conf.json",
},
proxy: {
appDir: "crates-tauri/yaak-app-proxy",
devPortEnv: "YAAK_PROXY_DEV_PORT",
fallbackDevPortEnv: null,
defaultPort: "2420",
tauriConfig: "tauri.conf.json",
tauriDevConfig: "tauri.development.conf.json",
},
};
const appConfig = appConfigs[appName];
if (appConfig == null) {
console.error(`Unknown Tauri app "${appName}"`);
process.exit(1);
}
const port =
process.env[appConfig.devPortEnv] ||
(appConfig.fallbackDevPortEnv
? process.env[appConfig.fallbackDevPortEnv]
: undefined) ||
appConfig.defaultPort;
const config = JSON.stringify({
build: { devUrl: `http://localhost:${port}` },
});
// Normalize extra `--config` path args to absolute paths from repo root so
// callers can keep passing root-relative config files.
const normalizedAdditionalArgs = [];
for (let i = 0; i < additionalArgs.length; i++) {
const arg = additionalArgs[i];
if (arg === "--config" && i + 1 < additionalArgs.length) {
const value = additionalArgs[i + 1];
const isInlineJson = value.trimStart().startsWith("{");
normalizedAdditionalArgs.push("--config");
normalizedAdditionalArgs.push(
!isInlineJson && !path.isAbsolute(value)
? path.join(rootDir, value)
: value,
);
i++;
continue;
}
normalizedAdditionalArgs.push(arg);
}
const args = [
"dev",
"--no-watch",
"--config",
appConfig.tauriConfig,
"--config",
appConfig.tauriDevConfig,
"--config",
config,
...normalizedAdditionalArgs,
];
// Invoke the tauri CLI JS entry point directly via node to avoid shell escaping issues on Windows
const tauriJs = path.join(
rootDir,
"node_modules",
"@tauri-apps",
"cli",
"tauri.js",
);
const result = spawnSync(process.execPath, [tauriJs, ...args], {
cwd: path.join(rootDir, appConfig.appDir),
stdio: "inherit",
env: process.env,
});
process.exit(result.status || 0);