(filePath?: string)
| 16 | * errors were found, 0 otherwise. |
| 17 | */ |
| 18 | export async function validateCommand(filePath?: string): Promise<void> { |
| 19 | if (!filePath) { |
| 20 | process.stderr.write("Usage: fh-workflow validate <file.json>\n"); |
| 21 | process.exit(1); |
| 22 | } |
| 23 | |
| 24 | const abs = path.resolve(process.cwd(), filePath); |
| 25 | let raw: string; |
| 26 | try { |
| 27 | raw = await fs.readFile(abs, "utf-8"); |
| 28 | } catch (err: unknown) { |
| 29 | const code = (err as NodeJS.ErrnoException).code; |
| 30 | if (code === "ENOENT") { |
| 31 | process.stderr.write(`File not found: ${abs}\n`); |
| 32 | process.exit(1); |
| 33 | } |
| 34 | throw err; |
| 35 | } |
| 36 | |
| 37 | let parsed: unknown; |
| 38 | try { |
| 39 | parsed = JSON.parse(raw); |
| 40 | } catch (err) { |
| 41 | process.stderr.write(`Invalid JSON: ${err instanceof Error ? err.message : String(err)}\n`); |
| 42 | process.exit(1); |
| 43 | } |
| 44 | |
| 45 | let workflow: ApiWorkflow; |
| 46 | try { |
| 47 | workflow = migrate(parsed); |
| 48 | } catch (err) { |
| 49 | process.stderr.write(`${err instanceof Error ? err.message : String(err)}\n`); |
| 50 | process.exit(1); |
| 51 | } |
| 52 | |
| 53 | const result = validateWorkflow(workflow); |
| 54 | |
| 55 | printReport(abs, result); |
| 56 | |
| 57 | if (result.totalErrors > 0) process.exit(1); |
| 58 | } |
| 59 | |
| 60 | function printReport(file: string, result: ValidationResult): void { |
| 61 | const out = process.stdout; |
no test coverage detected