Newer
Older
TelosDB / tools / debug-ui-with-serve.mjs
#!/usr/bin/env node
/**
 * フロントのみ 8474 で立ち上げて Puppeteer でスクリーンショット取得。Tauri 不要。
 * 使い方: node tools/debug-ui-with-serve.mjs
 * 出力: tmp/debug-ui-screenshot-settings.png 等。終了時に 8474 のプロセスを停止する。
 */
import { spawn, 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 root = path.resolve(__dirname, '..');

async function waitFor(url, maxMs = 5000) {
  const deadline = Date.now() + maxMs;
  while (Date.now() < deadline) {
    try {
      const r = await fetch(url, { method: 'HEAD', signal: AbortSignal.timeout(1500) });
      if (r.ok) return true;
    } catch (_) {}
    await new Promise((r) => setTimeout(r, 300));
  }
  return false;
}

async function main() {
  // 8474 を空ける
  const kill = spawnSync('node', ['tools/kill-ports.mjs'], { cwd: root, stdio: 'pipe' });
  if (kill.status !== 0) {
    console.warn('kill-ports:', kill.stderr?.toString() || kill.stdout?.toString());
  }

  const server = spawn('node', ['tools/serve-frontend.mjs'], {
    cwd: root,
    stdio: ['ignore', 'pipe', 'pipe'],
    shell: false,
  });

  let closed = false;
  server.on('error', (e) => {
    console.error('serve-frontend error:', e.message);
    closed = true;
  });
  server.on('exit', () => { closed = true; });
  server.stderr?.on('data', (d) => process.stderr.write(d));
  server.stdout?.on('data', (d) => process.stdout.write(d));

  try {
    const ok = await waitFor('http://127.0.0.1:8474');
    if (!ok) {
      console.error('8474 が起動しませんでした');
      process.exitCode = 1;
      return;
    }
    const r = spawnSync('node', ['tools/debug-ui-puppeteer.mjs'], {
      cwd: root,
      stdio: 'inherit',
      env: { ...process.env, DEBUG_UI_URL: 'http://127.0.0.1:8474' },
    });
    process.exitCode = r.status ?? (r.signal ? 128 : 0);
  } finally {
    if (!closed && server.pid) {
      try {
        process.kill(server.pid, 'SIGTERM');
      } catch (_) {}
    }
  }
}

main();