#!/usr/bin/env node "use strict"; const fs = require("fs"); const path = require("path"); const { spawnSync } = require("child_process"); const { STAGES, resolveStages, canonicalStages } = require("./lib/build-stages"); const repoRoot = path.resolve(__dirname, ".."); function areaConfigs() { return fs.readdirSync(path.join(repoRoot, "config", "areas")) .filter((file) => file.endsWith(".json")) .sort() .map((file) => path.join(repoRoot, "config", "areas", file)); } function requireTty(input = process.stdin, output = process.stdout) { if (!input.isTTY || !output.isTTY) throw new Error("Interactive build requires a TTY. Use npm run build:area -- --config --stages instead."); } async function main() { requireTty(); const configs = areaConfigs(); if (!configs.length) throw new Error("No area configs found in config/areas."); const { select, checkbox } = await import("@inquirer/prompts"); const config = await select({ message: "Choose an area", choices: configs.map((file) => ({ name: path.basename(file, ".json"), value: file })), }); const chosen = await checkbox({ message: "Choose build stages", choices: STAGES.map((stage) => ({ name: `${stage.id} - ${stage.description}`, value: stage.id })), required: true, }); if (!chosen.length) throw new Error("Choose at least one build stage."); const stages = canonicalStages(resolveStages({}, chosen)); console.log(`Area: ${path.basename(config)}`); console.log(`Stages: ${stages.join(", ")}`); const result = spawnSync(process.execPath, [path.join(__dirname, "build-area.js"), "--config", config, "--stages", stages.join(",")], { stdio: "inherit" }); if (result.error) throw result.error; process.exitCode = result.status || 0; } if (require.main === module) main().catch((error) => { if (error.name !== "ExitPromptError") console.error(`Error: ${error.message}`); process.exitCode = error.name === "ExitPromptError" ? 0 : 1; }); module.exports = { areaConfigs, requireTty };