rigjs
Version:
A multi-repos dev tool based on yarn and git.Rigjs is intended to be the simplest way to develop,share and deliver codes between different developers or different projects.
70 lines (64 loc) • 2.56 kB
text/typescript
import fs from 'fs';
import path from 'path';
import { spawnSync } from 'child_process';
import print from '../../print';
import { paths, daemonLabel } from '../paths';
import { requireMacOS } from '../platform';
function findRigEntry(): string {
// Walk up from this file to find the package root, then return built/index.js
let dir = __dirname;
for (let i = 0; i < 10; i++) {
const pkg = path.join(dir, 'package.json');
if (fs.existsSync(pkg)) {
try {
const p = JSON.parse(fs.readFileSync(pkg, 'utf8'));
if (p.name === 'rigjs') return path.join(dir, 'built', 'index.js');
} catch { /* keep walking */ }
}
const parent = path.dirname(dir);
if (parent === dir) break;
dir = parent;
}
throw new Error('could not locate rigjs install root');
}
function findNode(): string {
// Prefer /usr/local/bin/node (Homebrew Intel) then /opt/homebrew/bin/node (arm64).
for (const p of ['/usr/local/bin/node', '/opt/homebrew/bin/node']) {
if (fs.existsSync(p)) return p;
}
// Fall back to whichever node is invoking us right now.
return process.execPath;
}
export default function daemonInstall(): void {
requireMacOS();
fs.mkdirSync(path.dirname(paths.launchAgent), { recursive: true });
fs.mkdirSync(paths.logs, { recursive: true });
const nodeBin = findNode();
const rigEntry = findRigEntry();
const plist = `xml version="1.0" encoding="UTF-8"
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>${daemonLabel}</string>
<key>ProgramArguments</key><array>
<string>${nodeBin}</string>
<string>${rigEntry}</string>
<string>wiki</string><string>daemon</string><string>runner</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>StandardOutPath</key><string>${paths.daemonLog}</string>
<key>StandardErrorPath</key><string>${paths.daemonLog}</string>
</dict></plist>
`;
fs.writeFileSync(paths.launchAgent, plist, 'utf8');
// bootstrap (idempotent: bootout first to allow re-install)
const uid = process.getuid?.() ?? 0;
spawnSync('launchctl', ['bootout', `gui/${uid}`, paths.launchAgent], { stdio: 'ignore' });
const boot = spawnSync('launchctl', ['bootstrap', `gui/${uid}`, paths.launchAgent], { stdio: 'inherit' });
if (boot.status !== 0) {
print.error('launchctl bootstrap failed');
process.exit(1);
}
print.succeed(`installed launchd agent ${daemonLabel}`);
print.info(`logs: ${paths.daemonLog}`);
}